java 垃圾自动回收(二)

2.3.2应用场景
?    Serial Collector:适用于客户端应用程序,并且对暂停时间要求不严格,能够有效地管理64M左右的内存,垃圾回收导致的暂停时间在半秒内
?    Parallel Collector:适用于多处理器的服务器,并且对暂停时间要求不严格,譬如批处理等
?    ParallelCompacting Collector:适用于多处理器的服务器,并且对暂停时间稍微严格的应用
?    Concurrent Mark-Sweep (CMS) Collector:适用于多处理器的服务器,并且对暂停时间非常严格的应用
2.3.3.Sun HotSpot JVM参数自动调整
2.3.3.1.server和client模式
?    除了32位的windows系统,只要服务器拥有2+个处理器单元和2G+的系统内存,虚拟机自动识别为server模式,否则为client模式
?    可以通过在启动参数中指定-server或者-client来指定使用的模式
?    Client模式默认使用serial garbage collector,初始4M、最多64M的堆内存
?    Server模式默认使用parallel collector,初始1/64的物理内存最多不超过1G、最多1/4的物理内存最多不超过1G
?    可以通过指定特定的参数来覆盖默认的参数
2.3.3.2.Parallel Collector根据设定的目标自动调整
?    指定暂停时间目标:通过指定-XX:MaxGCPauseMillis=n启动参数来设定最大的暂停时间目标,单位为毫秒,虚拟机自动根据该目标来调整各个代空间的大小,当然,有时会也会无法达到目标,另外,该参数可能会降低系统的吞吐量。默认情况下,虚拟机不指定暂停时间。
?    指定吞吐量目标:通过指定-XX:GCTimeRatio=n 启动参数来设置最低的吞吐量目标,其中,n = 1 / (1-吞吐量) – 1,譬如预定的吞吐量为95%,则n = 1 / 5% - 1 = 19,虚拟机自动根据该目标自动调整各个代空间的大小,注意,该参数可能会加到垃圾回收导致的暂停时间。虚拟机默认目标吞吐量是99%。
2.4.常用的Sun HotSpot JVM启动参数
2.4.1.指定垃圾回收器
?    –XX:+UseSerialGC:使用Serial Collector
?    –XX:+UseParallelGC:使用Parallel Collector
?    –XX:+UseParallelOldGC:使用ParallelCompacting Collector(JDK6+)
?    –XX:+UseConcMarkSweepGC:使用Concurrent Mark-Sweep (CMS) Collector
2.4.2.Parallel and Parallel Compacting Collectors参数
?    –XX:ParallelGCThreads=n(默认为处理器数):并发垃圾回收线程数
?    –XX:MaxGCPauseMillis=n和–XX:GCTimeRatio=n:见2.4.2说明
2.4.3.CMS Collector参数
?    –XX:+CMSIncrementalMode(默认为disable):启用垃圾回收增量模式,该模式可降低因垃圾回收导致的暂停时间
?    –XX:ParallelGCThreads=n(默认为处理器数):并发垃圾回收线程数
?    –XX:+CMSIncrementalPacing(默认为disable):与上一个参数配合使用,根据应用程序的行为自动调整每次执行的垃圾回收任务的幅度(或比例?)(原文:Enables automatic control of the amount of work the CMS collector is allowed to do before giving up the processor, based on application behavior.)
?    -XX:CMSIncrementalDutyCycle=<N> (default: 5):每次增量回收垃圾的占总垃圾回收任务的比例,如果参数CMSIncrementalPacing指定,则指的是初始比例。(原文:This is the percentage (0-100) of time between minor collections that the concurrent collector is allowed to run. If CMSIncrementalPacing is enabled, then this is just the initial value.)
?    -XX:CMSIncrementalDutyCycleMin=<N> (default: 10):与CMSIncrementalPacing参数配合使用,每次增量回收垃圾的占总垃圾回收任务的最小比例(原文:This is the percentage (0-100) which is the lower bound on the duty cycle when CMSIncrementalPacing is enabled.)
2.4.4.垃圾回收统计(系统剖析和性能调优使用)
?    –XX:+PrintGC:打印每次垃圾回收的基本信息
?    –XX:+PrintGCDetails:打印每次垃圾回收的详细信息
?    –XX:+PrintGCTimeStamps:在每次垃圾回收时打印时间,与上两个参数之一结合使用
2.4.5.堆空间和代空间设置
?    –Xmsn:初始堆空间,譬如-Xms512M
?    –Xmxn:最大堆空间,譬如-Xmx1024M,一般可指定这两个参数一致以避免在系统运行期间进行堆空间的调整
?    –XX:MinHeapFreeRatio=minimum(默认40):当代空闲空间在代空间中比例大于maximum时,自动减少代空间以小于该值
?    –XX:MaxHeapFreeRatio=maximum(默认70):当代空闲在代空间中比例小于minimum时,自动增长代空间以大于该值
?    –XX:NewSize=n:默认年轻代空间的大小,譬如–XX:NewSize=400M
?    –XX:NewRatio=n(默认server模式是8,client模式是2):年轻代空间与年老代空间的比例
?    –XX:SurvivorRatio=n(默认是32):Eden区与Survivor区的比例,譬如–XX:SurvivorRatio=7,则每个Survivor区占整个年轻代空间的1/9(注意,有两个Survivor区)
?    –XX:MaxPermSize=n:持久区大小,譬如–XX:MaxPermSize=128M
3.    装备我们的工具箱
3.1.内存剖析(jmap+jhat)
3.1.1.命令
?    Jps:与ps命令类似,显示java进程的进程号
?    Jmap: 统计当前虚拟机的堆内存数据,一般使用如下:jmap –dump:file=filename {pid},将统计数据dump到filename文件中
?    Jhat(Java Heap Analysis Tool):将上一个命令的统计数据文件分析后以html的方式展现,一般使用如下:jhat –J-mx512M filename
3.1.2.常用的统计数据
    在jhat程序运行后,访问http://{server}:7000查看统计数据
3.1.2.1.每个类的实例数(按实例数从多到少排序)

图7 类实例数统计截图
3.1.2.2.每个类的实例数和占用空间数(按占用空间数从大到小排序)

图8 类实例占用空间统计截图
3.1.2.3.每个类的引用统计(如下是String被其它类的实例引用的次数统计,按引用次数从多到少排序)

图9 类java.lang.String引用截图案
3.2.虚拟机监控(jconsole)
http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html
3.3.综合剖析工具(jprofiler)
Jprofiler是一个功能非常强大的性能剖析工具,但其对系统的性能影响非常之大,一般只能用于测试环境的性能剖析,特别是执行时间统计剖析。入门使用可参见如下的链接
http://www.blogjava.net/ddpie/archive/2007/05/14/117450.html
4.    参考文档
?    <<Memory Management in the Java HotSpot? Virtual Machine>>
?    <<Java SE 6 HotSpot?  Virtual Machine Garbage Collection Tuning >>
?    << Garbage Collector Ergonomics>>
?    <<深入JAVA虚拟机>>

你可能感兴趣的:(java,多线程,虚拟机,cms,应用服务器)