对java中gc的简单理解

1,java垃圾回收概括

java GC(Garbage Collection)机制,是java与C++/C的主要区别之一,作为java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题也不用像C程序员那样战战兢兢。这是因为在java虚拟机中,存在自动内存管理和垃圾清扫机制。
概括的说,该机制对JVM中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息的保证JVM的内存空间,放置出现内存泄露和溢出的问题。
java gc机制主要完成3件事,确定哪些内存需要回收,确定什么时候需要执行gc,如何执行gc。
学习java gc机制,可以帮助我们在日常工作中排查各种内存溢出或泄露问题,解决性能瓶颈,达到更高的并发量,写出更高效的程序。

2,java gc机制

分别分为年轻代,老年代,永久代(方法区)

3,JVM参数使用

1 堆内存相关

  • -Xms 与 -Xmx

-Xms用于指定Java应用使用的最小堆内存,如-Xms1024m表示将Java应用最小堆设置为1024M。-Xmx用于指定Java应用使用的最大堆内存,如-Xmx1024m表示将Java应用最大堆设置为1024m。过小的堆内存可能会造成程序抛出OOM异常,所以正常发布的应用应该明确指定这两个参数。并且,一般会选择将-Xms-Xmx设置成一样大小,防止JVM动态调整堆内存容量对程序造成性能影响。

  • -Xmn

通过-Xmn可以设置堆内存中新生代的容量,以此达到间接控制老年代容量的作用,因为没有JVM参数可以直接控制老年代的容量。如-Xmn256m表示将新生代容量设置为256M。假如这个时候额外指定了-Xms1024m -Xmx1024m,那么老年代的容量为768M(1024-256=768)。

  • -XX:PermSize 与 -XX:MaxPermSize

-XX:PermSize-XX:MaxPermSize分别用于设置永久代的容量和最大容量。如-XX:PermSize=64m -XX:MaxPermSize=128m表示将永久代的初始容量设置为64M,最大容量设置为128M。

  • -XX:SurvivorRatio

这个参数用于设置新生代中Eden区和Survivor(S0、S1)的容量比值。默认设置为-XX:SurvivorRatio=8表示Eden区与Survivor的容量比例为8:1:1。假设-Xmn256m -XX:Survivor=8,那么Eden区容量为204.8M(256M / 10 8),S0和S1区的容量大小均为25.6M(256M / 10 1)。

2 GC收集器相关

  • -XX:+UseSerialGC

虚拟机运行在client模式下的默认值,使用这个参数表示虚拟机将使用Serial + Serial Old收集器组合进行垃圾回收。

-XX:+UseSerialGC表示使用这个设置,而-XX:-UseSerialGC表示禁用这个设置。
  • -XX:+UseParNewGC

使用这个设置以后,虚拟机将使用ParNew + Serial Old收集器组合进行垃圾回收。

  • -XX:+UseConcMarkSweepGC

使用这个设置以后,虚拟机将使用ParNew + CMS + Serial Old的收集器组合进行垃圾回收。注意Serial Old收集器将作为CMS收集器出现Concurrent Mode Failure失败后的后备收集器来进行回收(将会整理内存碎片)。

  • -XX:+UseParallelGC

虚拟机运行在server模式下的默认值。使用这个设置,虚拟机将使用Parallel Scavenge + Serial Old(PS MarkSweep)的收集器组合进行垃圾回收。

  • -XX:+UseParallelOldGC

使用这个设置以后,虚拟机将使用Parallel Scavengen + Parallel Old的收集器组合进行垃圾回收。

  • -XX:PretenureSizeThreshold

设置直接晋升到老年代的对象大小,大于这个参数的对象将直接在老年代分配,而不是在新生代分配。注意这个值只能设置为字节,如-XX:PretenureSizeThreshold=3145728表示超过3M的对象将直接在老年代分配。

  • -XX:MaxTenuringThreshold

设置晋升到老年代的对象年龄。每个对象在坚持过一次Minor GC之后,年龄就会加1,当超过这个值时就进入老年代。默认设置为-XX:MaxTenuringThreshold=15

  • -XX:ParellelGCThreads

设置并行GC时进行内存回收的线程数。只有当采用的垃圾回收器是采用多线程模式,包括ParNew、Parallel Scavenge、Parallel Old、CMS,这个参数的设置才会有效。

  • -XX:CMSInitiatingOccupancyFraction

设置CMS收集器在老年代空间被使用多少(百分比)后触发垃圾收集。默认设置-XX:CMSInitiatingOccupancyFraction=68表示老年代空间使用比例达到68%时触发CMS垃圾收集。仅当老年代收集器设置为CMS时候这个参数才有效。

  • -XX:+UseCMSCompactAtFullCollection

设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片整理。仅当老年代收集器设置为CMS时候这个参数才有效。

  • -XX:CMSFullGCsBeforeCompaction

设置CMS收集器在进行多少次垃圾收集后再进行一次内存碎片整理。如设置-XX:CMSFullGCsBeforeCompaction=2表示CMS收集器进行了2次垃圾收集之后,进行一次内存碎片整理。仅当老年代收集器设置为CMS时候这个参数才有效。

3 GC日志相关

  • -XX:+PrintGCDetails

表示输出GC的详细情况。

  • -XX:+PrintGCDateStamps

指定输出GC时的时间格式,比指定-XX:+PrintGCTimeStamps可读性更高。

  • -Xloggc

指定gc日志的存放位置。如-Xloggc:/var/log/myapp-gc.log表示将gc日志保存在磁盘/var/log/目录,文件名为myapp-gc.log
主要参考资料来源

你可能感兴趣的