JVM内存分配策略
我们将介绍几个JVM中对象在分配内存是应该遵循的策略。毕竟,想要去优化程序,不仅要考虑垃圾回收的过程,还要从对象内存分配的角度减少gc的代价。
一、gc日志格式
在这里先介绍一下gc日志的格式,分析gc日志是了解gc过程最直接的方式。对于大量的日志分析,直接查看日志文件当然不方便,我们一般会使用日志分析工具,后边会有介绍,但是对于简短的日志(如十几条),一般直接查看就行了。开启日志输出的JVM参数如下:
-XX:+PrintGCDetails //打印gc日志
-XX:+PrintGCDateStamps //打印时间
-Xloggc: //输出路径
对应的日志输出格式如下(采用不同参数或不同虚拟机可能不同,但大同小异):
2014-03-09T18:10:+0800: : [GC : [DefNew: 35072K->4352K(39424K), secs] 75088K->45293K(126848K), secs] [Times: user= sys=, real= secs]
2014-03-09T18:10:+0800: : [Full GC : [Tenured: 40941K->42890K(87424K), secs] 62210K->42890K(126848K), [Perm : 36863K->36863K(36864K)], secs] [Times: user= sys=, real= secs]
35072K->4352K(39424K):gc前使用内存大小->gc后使用大小(该区域总大小)
2014-03-09T18:10:+0800: gc时间
: gc耗时
GC : 表示停顿类型和停顿时间,如果是Full表示gc是Stop-The-World的
DefNew: Tenured: Perm : gc发生的区域,DefNew年轻代;Tenured年老代;Perm永久代
Times: user= sys=, real= secs user:用户态耗时;sys:内核态耗时;real:gc从开始到结束消耗的Wall Clock Time耗时(墙钟时间,名字好怪,包括各种非运算的等待耗时和cpu耗时)
二、内存分配策略
1、对象优先在Eden分配
新的对象大多数情况下在Eden去分配,这样在Eden区域没有足够空间时,JVM会首先进行Minor Gc,仅对Eden进行gc,并将符合条件的对象移至年老代。这样如果Eden在gc后满足新对象的空间需求,则能避免进行Full GC。
2、大对象直接进入年老代
这一点十分好理解,多数情况下大对象的生命周期是相对较长的,而大对象如果分配在Eden,不仅占用大量空间,触发gc,还可能会在Eden区/两个 Survivor区之间来回复制,十分耗费
Java虚拟机内存分配策略 来自淘豆网m.daumloan.com转载请标明出处.