堆(线程共享):又可以细分为 新生代和老生代,大部分java对象都是存在堆中;
栈(线程私有):又可以细分为虚拟机栈和本地方法栈,虚拟机栈是有栈帧组成,每一个方法的栈帧是在编译期就确定的,方法的执行就是进栈和出栈的过程;
方法区(线程共享):主要存放类信息、方法的字节吗、以及静态常量;jdk8中,将string常量池从方法区移到堆中。
程序计数(实际上是pc寄存器,线程私有):指示代码运行的位置,条件、循环、分支等都是通过计数器指示如何取下一条指令。
复制算法
标记 - 清除算法
标记 - 整理算法
-xx:+heapdumponoutofmemoryerror 生成内存快照;设置路径:-xx:heapdumppath=<path>
-xx:onoutofmemoryerror ="sh ~/cleanup.sh" 当内存溢出时,执行脚本
查看垃圾回收的执行情况:
jstat -gcutil pid 1000 10 1000是输出时间间隔,单位毫秒,10 是输出记录的数目
s0 — heap上的 survivor space 0 区已使用空间的百分比
s1 — heap上的 survivor space 1 区已使用空间的百分比
e — heap上的 eden space 区已使用空间的百分比
o — heap上的 old space 区已使用空间的百分比
p — perm space 区已使用空间的百分比
ygc — 从应用程序启动到采样时发生 young gc 的次数
ygct-- 从应用程序启动到采样时 young gc 所用的时间(单位秒)
fgc — 从应用程序启动到采样时发生 full gc 的次数
fgct-- 从应用程序启动到采样时 full gc 所用的时间(单位秒)
gct — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)