这里向大家简单介绍一下JVM垃圾回收的相关知识JVM使用的是分代垃圾回收的方式可以将Java对象分为年轻对象和年老对象JVM将内存堆(Heap)分为两个区域一个是年轻区另一个是老区Java将这两个区域分别称作是新生代和老生代 JVM垃圾回收的相关知识 JVM使用的是分代垃圾回收的方式主要是因为在程序运行的时候会有如下特点 ◆大多数对象在创建后很快就没有对象使用它了 ◆大多数在一直被使用的对象很少再去引用新创建的对象 因此就将Java对象分为年轻对象和年老对象JVM将内存堆(Heap)分为两个区域一个是年轻区另一个是老区Java将这两个区域分别称作是新生代和老生代 新生代区域中绝大多数新创建的对象都存放在这个区域里此区域一般来说较小而且JVM垃圾回收频率较高同时因为新生代采用的算法和其存放的对象的特点使该区域JVM垃圾回收的效率也非常高 而老生代区域中存放的是在新生代中生存了较长时间的对象这些对象将被转移到老生代区这个区域一般要大一些而且增长的速度相对于新生代要慢一些老生代JVM垃圾回收的执行频率也会低很多 由于JVM在JVM垃圾回收处理时会消耗一定的系统资源因此有时候通过JVM启动的时候添加相关参数来控制新生代区域的大小来调整JVM垃圾回收处理的频率非常有用以便于我们更合理的利用系统资源 新生代区域设置参数是Xmn用这个参数可以制定新生代区域的大小 我们来举一个例子说明 我们就用系统自带的程序作为例子在命令行上键入如下指令 CDC:\java\demo\jfc\SwingSet[回车]C:\java\demo\jfc\SwingSet> javajarverbose:gcXmnmXX:+PrintGCDetailsSwingSetjar[回车] 上面加入了一个新的参数XX:+PrintGCDetails这个参数能够打印出GC的详细信息屏幕输出如下(节选) [GC[DefNew:K>K(K)secs]K> K(K)secs][GC[DefNew:K> K(K)secs]K> K(K)secs][GC[DefNew:K> K(K)secs]K> K(K)secs][GC[DefNew:K> K(K)secs]K> K(K)secs] 我们需要解释一下输出的详细内容的意思拿第一行输出来说 DefNew:K>K(K)secs是指新生代的JVM垃圾回收情况这里的意思是从占用K内存空间变为K内存空间用时秒 K>K(K)secs是指总体GC的回收情况整体堆空间占用从K降低到K的水平用时秒 那么这时候我们在将新生代的内存设为M并把堆的最大可控值设定为M再去执行键入如下指令 javajarverbose:gcXmnmXmxmXX:+PrintGCDetailsSwingSetjar[回车] 得到的结果如下(节选) [GC[DefNew:K>K(K)secs] [Tenured:K>K(K)secs]K> K(K)secs][GC[DefNew:K> K(K)secs][Tenured:K> K(K)secs]K> K(K)secs][GC[DefNew:K> K(K)secs][Tenured:K> K(K)secs]K> K(K)secs] 这个结果说明 [DefNew:K>K(K)secs]是指新生代的JVM垃圾回收情况这里的意思是从占用K内存空间变为K内存空间用时秒 K>K(K)secs是指总体GC的回收情况整体堆空间占用从K降低到K的水平用时秒 [Tenured:K>K(K)secs]是指老生代GC的回收情况整体堆空间占用从K降低到K的水平用时秒 通过这些参数的调整我们可以看到在处理垃圾收集问题时从JVM垃圾回收的频率是时间方面的变化我们可以根据不同程序的不同情况予以调整 最后有必要提一下GC的相关参数 XX:+PrintGCDetails显示GC的详细信息 XX:+PrintGCApplicationConcurrentTime打印应用执行的时间 XX:+PrintGCApplicationStoppedTime打印应用被暂停的时间 注:后的+号表示开启此选项如果是号那么表示关闭此选项 |