jvm gc相关

简介:

1. 杂类

http://www.oracle.com/technetwork/java/faq-140837.html 

*    -XX:+UseParallelGC : 和传统的新生代GC一样,只是可以进行并行标记处理。 可通过-XX:ParallelGCThreads指定并发线程数,默认值:-XX:ParallelGCThreads =<#cpus < 8 ? #cpus : 3 + ((5 * #cpus) / 8) >


1.The new parallel garbage collector is similar to the young generation collector in the default garbage collector but uses multiple threads to do the collection. By default on a host with N CPUs, the parallel garbage collector uses N garbage collector threads in the collection. The number of garbage collector threads can be controlled with a command line option (see below). On a host with a single CPU the default garbage collector is used even if the parallel garbage collector has been requested. On a host with 2 cpus the Parallel garbage collector generally performs as well as the default garbage collector and a reduction in the young generation garbage collector pause times can be expected on hosts with more than 2 cpus.  


* XX:+UseParNewGC: 和UseParallelGC类似,也是并行处理,但实现技术还是不同,据说在新生代的火车模型上有更少的停顿时间。

 

-XX:+ DisableExplicitGC : 禁用system.gc()调用


1.Don't call System.gc(). The system will make the determination of when it's appropriate to do garbage collection and generally has the information necessary to do a much better job of initiating a garbage collection. If you are having problems with the garbage collection (pause times or frequency), consider adjusting the size of the generations. 

* -XX:+AggressiveOpts 加快编译 

 

* -XX:+UseBiasedLocking 锁机制的性能改善。

 

* -Xss=256k


1.-Xss 是线程栈的大小, 这个参数需要严格的测试, 一般小的应用, 如果栈不是很深, 应该是128k够用的, 不过,我们的应用调用深度比较大, 还需要做详细的测试。 这个选项对性能的影响比较大。 建议使用256K的大小.  

2. CMS介绍

文章:http://www.iteye.com/topic/473874

 

 

-XX:+CMSParallelRemarkEnabled : 在和UseParNewGC一起使用的情况下,尽量减少mark的时间

 

-XX:+UseConcMarkSweepGC : 指定在Old Generation使用concurrent gc

 

-XX:+UseCMSCompactAtFullCollection : 在使用concurrent gc的情况下,防止memory fragmention

 

-XX:CMSInitiatingOccupancyFraction=n : 指示在old generation在使用了n%的后,触发cms gc

 

-XX:+UseCMSInitiatingOccupancyOnly : 指示只有在old generation在使用了初始化的比例后启动cms gc

 

 

公司参数列表记录:


1.-server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=128m  
2.-Xss256k  
3.-XX:+DisableExplicitGC  
4.-XX:+UseConcMarkSweepGC  
5.-XX:+CMSParallelRemarkEnabled  
6.-XX:+UseCMSCompactAtFullCollection  
7.-XX:LargePageSizeInBytes=128m  
8.-XX:+UseFastAccessorMethods  
9.-XX:+UseCMSInitiatingOccupancyOnly  
10.-XX:CMSInitiatingOccupancyFraction=70 

3. G1介绍

 

http://www.oracle.com/technetwork/java/javase/tech/g1-intro-jsp-135488.html

 

jdk 1.6.14中首次引入了G1. 

 

G1的特点描述: 

 

  1. 并发性和并行性。 充分利用系统硬件资源,多核多CPU的资源,通过多线程并发和并行技术,尽量减少“stop-the-world”,也就是系统停顿时间。
  2. 代收集。 和普通的GC收集器一样,区分young对象和old对象为不同的收集策略。针对young区关注的是存活的对象,因为young大多数都是需要被GC回收的。
  3. 压缩。 不同于CMS收集,G1垃圾收集器一直都会对heap区做压缩,避免内存碎片的产生。
  4. 可预测性。G1相比于CMS针对GC的“stop-the-world”的有更好的可预测性,主要归功于G1的压缩避免内存碎片对GC pause time的影响,G1还有相应的预测模型,通过许多方式,尽量去满足一个pause time的预期。
G1和CMS不同点:
  1. G1没有严格的young,old区的划分,它将整个heap区当作是一个连续的物理内存块进行处理。这样G1可以很方便,很灵活的进行对象的拷贝和移动。
  2. G1同样有from/to的survivors regoins
  3. G1和CMS一样会有 concurrent marking phase,通过并发从root对象进行存活对象进行标记,但是它与CMS相比,没有concurrent sweeping phase处理

G1相关参数:
  1. -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC (开启使用G1 GC)
  2. -XX:MaxGCPauseMillis =50 (for a pause time target of 50ms)
  3. -XX:GCPauseIntervalMillis =200 (for a pause interval target of 200ms)
  4. -XX:+G1YoungGenSize=512m  (for a 512 megabyte young generation) 这里搞不明白,是G1重新划分新生代?还是仅仅只是在GC中划分的区域。
  5.  -XX:SurvivorRatio=6 调整surivor regoins的大小
  6. -XX:+G1ParallelRSetUpdatingEnabled -XX:+G1ParallelRSetScanningEnabled 不知道干吗的,先记着

4. gc相关调试参数:


打印GC时间参数: -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/home/test/logs/gc.log 

.

1.49.414: [GC [PSYoungGen: 10480K->0K(524160K)] 11272K->792K(2097024K), 0.0002270 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]   

显示在程序运行的49.414发生了Minor的垃圾收集,前一段数据针对新生区,从10480K整理为0k,新生区总大小为524160K,程序暂停了0.2ms,而后一段数据针对整个堆。

详细暂停时间参数: -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime
 

5. GC算法组合

GC的算法
复制(Copying)
标记-清除(Mark-Sweep)
标记-清除-整理(Mark-Sweep-Compact)
 

 

三种垃圾收集器
Serial GC
Parallel GC/Parallel Old GC
Concurrent Mark-Sweep GC (CMS)

 

GC算法组合:

 

说明:

  • UseSerialGC:"Serial" + "Serial Old"
  • UseParNewGC:"ParNew" + "Serial Old"
  • UseConcMarkSweepGC:"ParNew" + "CMS" + "Serial Old". "CMS" is used most of the time to collect the tenured generation. "Serial Old" is used when a concurrent mode failure occurs.
  • UseParallelGC:"Parallel Scavenge" + "Serial Old"
  • UseParallelOldGC:"Parallel Scavenge" + "Parallel Old"

如果GC算法参数搭配不合理,会出现类似错误:

写道
Conflicting collector combinations in option list; please refer to the release notes for the combinations allowed
Could not create the Java virtual machine. 


相关文章
|
4月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
417 3
|
4月前
|
监控 Java 测试技术
JVM 性能调优 及 为什么要减少 Full GC
JVM 性能调优 及 为什么要减少 Full GC
118 4
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
65 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
18天前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
4月前
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
46 0
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
43 3
|
1月前
|
算法 Java
JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
本文详细介绍了JVM中的GC算法,包括年轻代的复制算法和老年代的标记-整理算法。复制算法适用于年轻代,因其高效且能避免内存碎片;标记-整理算法则用于老年代,虽然效率较低,但能有效解决内存碎片问题。文章还解释了这两种算法的具体过程及其优缺点,并简要提及了其他GC算法。
 JVM进阶调优系列(4)年轻代和老年代采用什么GC算法回收?
|
1月前
|
存储 Java PHP
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
【JVM】垃圾回收机制(GC)之引用计数和可达性分析
60 0
|
4月前
|
存储 算法 安全
(八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析
在《GC分代篇》中,我们曾对JVM中的分代GC收集器进行了全面阐述,而在本章中重点则是对JDK后续新版本中研发推出的高性能收集器进行深入剖析。
162 12
|
4月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
103 8