JVM Trace跟踪参数
-verbose:gc
打印GC日志信息
-XX:+PrintGCDetails
打印GC日志信息
-Xloggc:d:/gc.log
GC日志目录
-XX:+PrintHeapAtGC
每次一次GC后,都打印堆信息
-XX:+TraceClassLoading
类加载信息
JVM 内存分配参数详解
-Xmx
最大堆
–Xms
最小堆
-Xmn
新生代大小 (eden+2s)
–XX:NewRatio
年轻代(eden+2s):老年代
–XX:SurvivorRatio
2s:eden
-Xss
决定方法调用的深度
没个线程独有栈空间
参数,局部变量分配在栈上
一般几百K就够了,64位jvm默认1M
对栈深度的影响
JVM 内存参数案例讲解
标记-清除算法
标记阶段
标记存活对象
清除阶段
统一回收所有未标记的对象
缺点
会产生内存碎片
如果空间内存碎片太多,当程序产生大对象无法在堆中找到连续空间大小存放的时候,会强制发生GC
复制算法
原理
内存一分为二,每次只使用其中一块,当一块内存没有连续空间存储对象的时候,会把存活下来的对象复制到另外一块内存中,然后一次性清除之前的哪块空间
优缺点
没有内存碎片问题
代价就是讲内存减少了一半,空间利用率不高
不适用于存活对象较多的场景,比如老年代
而实际上我们并不需要按照1:1的比例来划分,因为大部分对象从创建到结束这个生命周期很短
HotSpot虚拟机默认Eden:Survivor=8:1
标记-整理算法
原理
标记存活对象,然后把存活对象向一端移动
清理掉存活对象这端以外的所有空间
优缺点
适合用于存活对象较多的场合,如老年代
解决了空间碎片和效率问题:
将所有的存活对象压缩到内存的一端,然后清理边界外所有的空间
分代收集算法
分代思想
堆划分为新生代和老年代
新生代中,能够存活的对象很少,可以使用复制算法
老年代中,对象存活率高,而且没有额外的空间用来做老年代的担保,可以使用标记清除或者标记整理算法
JVM 内存回收
GC
Serial 新生代串行收集器 新(复制算法),老(标记整理)
ParNew 新生代并行收集器
Parallel Scavenge 新生代并行收集器
目标:尽可能缩GC时用户线程的停顿时间
在注重吞吐量或CPU资源敏感的场合,可以优先考虑Parallel Scavenge收集器 + Parallel Old收集器
Serial Old 老年代串行收集器
Parallel Old 老年代并行收集器
CMS 真正意义上的并发收集器(老年代收集器)
目标:最短的GC停顿时间
G1
分代收集GC组合
并发:用户线程和GC线程可以同时执行,如果发生GC,用户线程依然可以执行
并行:用户线程和GC线程可以同时执行,如果发生GC 用户线程会暂停