JVM内存分配
GC日志指令参数描述
-XX:+PrintGCDetails输出GC的详细日志
XX:+PrintGCTimeStamps输出GC的时间戳(以基准时间的形式)
-XX:+PrintGCDateStamps输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)
-XX:+PrintHeapAtGC在进行GC的前后打印出堆的信息
-XX:+PrintGCApplicationStoppedTime输出GC造成应用暂停的时间
-Xloggc:../logs/gc.log日志文件的输出路径
-XX:+UseSerialGC开启Serial收集器
-XX:+UseParallelGC -XX:+UseParallelOldGC开启Parallel收集器
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC开启CMS收集器
-XX:+UseG1GC开启G1收集器
-XX:MaxTenuringThreshold垃圾的最大年龄,值是从1到15,默认值是15
-XX:+PrintTenuringDistribution显示在survivor空间里面有效的对象的岁数情况
GC日志分析file:///C:/Users/Administrator/Desktop/Notes/resources/C0D94DB175FEF5E2AC68670A707C5F99.jpg public class Neicunfenpei {
public static void main(String[] args) {
byte[] b1 = new byte[4*1024*1024];
byte[] b3 = new byte[4*1024*1024];
byte[] b2 = new byte[14*1024*1024];
System.gc();
}
}
控制台输出的GC日志信息
file:///C:/Users/Administrator/Desktop/Notes/resources/544CB46478F8944FBDFA63538917DAE8.jpg 0.289: [GC (System.gc()) [PSYoungGen: 25865K->4656K(38400K)] 25865K->23096K(125952K), 0.0175657 secs] [Times: user=0.01 sys=0.01, real=0.02 secs]
0.306: [Full GC (System.gc()) [PSYoungGen: 4656K->0K(38400K)] [ParOldGen: 18440K->22977K(87552K)] 23096K->22977K(125952K), [Metaspace: 3080K->3080K(1056768K)], 0.0142619 secs] [Times: user=0.01 sys=0.01, real=0.02 secs] 输出数据含义
0.289、0.306GC发生的时间,java虚拟机启动以来经过的秒数
[GC是垃圾回收的停顿类型,而不是区分是新生代还是年老代
[Full GC是垃圾回收的停顿类型,而不是区分是新生代还是年老代,发生了Stop-The-World
[Full GC (System)是垃圾回收的停顿类型,而不是区分是新生代还是年老代,发生了Stop-The-World,调用 System.gc() 触发的垃圾回收
[DefNew, [Tenured, [PermSerial 收集器中新生代名为 Default New Generation
[ParNewParNew收集器表示 Parallel New Generation ,新生代名称
PSYoungGenParallel Scavenge 收集器 ,新生代名称
25865K->4656K(38400K)方括号内部显示的表示 GC 前该区域已使用容量 -> GC 后该区域已使用容量 (该区域内存总容量)
25865K->23096K(125952K)GC 前Java堆已使用容量 -> GC后Java堆已使用容量 (Java堆总容量)
0.0175657 secs该区域GC所占用的时间,单位是秒
[Times: user=0.01 sys=0.01, real=0.02 secs]分别代表 用户态消耗的CPU时间、内核态消耗的CPU时间 和 操作从开始到结束所经过的墙钟时间。墙钟时间包括各种非运算的等待耗时,如IO等待、线程阻塞。CPU时间不包括等待时间,当系统有多核时,多线程操作会叠加这些CPU时间,所以user或sys时间会超过real时间
内存分配策略首选需要知道不同的垃圾收集器会有不同的体现()
|
|