JVM堆与非堆
堆和非堆内存
Heap memory | Code Cache |
Eden Space 新生代 | |
Survivor Space 新生代 | |
Tenured Gen 老年代 | |
non-heap memory | Perm Gen 永久代 |
native heap?(I guess) |
内存监控方法
- jamp -heap pid 查看堆内存使用情况
1 | jmap -heap 212 |
JVM收集器设置
1 | –XX:+UseSerialGC |
Serial Collector
大部分平台或者加java -client参数
young generation算法 = serial
old generation算法 = serial (mark-sweep-compact)
缺点:串行,stop-the-world,速度慢,服务器不推荐使用
Parallel Collector
linux x64平台,或加java -server参数
young = parallel,多个thread同时copy
old = mark-sweep-compact = 1
优点:新生代回收更快,提高了吞吐量throughput(cpu用于非gc时间)
缺点:运行在8G/16G server上,old generation live obeject太多,pause time 过长(堆内存大->老年代大->能放的存活对象多)
Parallel Compact Collector(ParallelOld)
young = parallel = 2
old = parallel,分成多个独立单元,如果单元中存活对象少就回收,多则跳过
优点:old generation性能较2有提高
缺点:【大部分server系统old generation内存占用会达到60%-80%, 没有那么多理想的单元live object很少方便迅速回收,同时compact方面开销比起parallel并没明显减少。】
Concurrent Mark-Sweep(CMS) Collector
young = parallel = 2
old = cms
【同时不做compact操作】
优点:pause time 会降低,pause敏感但cpu有空闲的场景建议使用4
缺点:cpu占用过多,cpu密集型服务不适合使用。另外碎片多,object的存储要通过链表连续跳n个地方,空间浪费问题也会增大。