JavaRoadMap-2JVM

1. JVM内存结构
java的内存区域称为堆(heap), 它被分为三个主要部分分别对应对象的不同生存周期: Young Generation, Tenured Generation和Perm Generation,标记为Reserved的部分被保留,在必要时才实际分配出去。
Young Generation: 由Eden,和一个from Survivor空间还有一个to survivor空间。新对象创建于Eden中,Eden充满时,GC停止应用程序,把所有可到达的对象复制到from survivor空间,当from空间被充满时,GC把可到达对象复制到to survivor空间。一直在活动的对象在两个空间里不断的复制,直到进入旧域。
Perm Generation: 保存JVM整个生存周期都存在的对象,因此这个generation不需要垃圾收集。


2. JVM配置项
对JVM的性能调优就是对JVM内存进行调整控制,包括堆大小,Generation大小,GC的选择等等。
-X选项: 表示在JDK升级时不会通知更改。
-XX选项: 选项不够稳定
常用选项包括:
-Xnoclassgc : 禁用垃圾回收
-Xinege: 启用增量垃圾收集器
-Xloggc:file : 记录GC日志到file中
-Xmn640KB: 为Eden对象设定初始java堆大小,默认640KB
-Xms128M: 设定java堆初始尺寸,默认2MB,此值必须是1024字节(1KB)的倍数,且比它大
-Xmx512M: 设定Java堆的最大尺寸,默认64MB(这个属性的设置是针对OOM问题的主要调节办法)
-XX:-DiableExplicitGC: 忽略代码对System.gc()的显示调用,即禁止在代码中强制执行GC
-XX:-UseParallelOldGC: 使用并行GC
-XX:-UseSerialGC:使用串行GC
-XX:+AggressiveOpts:启用性能编译器检查点
-XX:CompileThreshold=10000: 在编译开始之前改变方法调用的数目
-XX:LargePageSizeInBytes=4m : 设置java堆的最大页大小
-XX:MaxHeapFreeRatio=70: GC之后,堆内存缩小之前可用堆内存的最大百分比, 默认为70.即在GC之后,如果还有大于70%的对内存则系统减少堆尺寸。
-XX:MaxNewSize=size:分配给新对象的内存上限默认640KB.
-XX:MaxPermSize=64m: Perm Generation的大小
-XX:MinHeapFreeRatio=40:GC之后,堆内存可用的最小百分比,默认是40%。意义同MaxHeapFreeRatio正好相反。
-XX:NewRatio=2 : Young Generation和Tenured Generation的比例,默认是2意思是新空间size是旧空间的1/2.
-XX:NewSize=2.125m: 为已分配内存的对象中的Eden域设置默认内存大小。
-XX:ReservedCodeCacheSize=32m:设置最大的代码缓存大小
-XX:SurvivorRatio=8:改变Eden对象空间和survivor空间的内存比例
-XX:-PrintGC:打印GC信息
-XX:-PrintGCDetails:打印更多GC细节
-XX:-PrintGCTimeStamps:打印GC时间信息
-XX:-TraceClassLoading:跟踪类的加载

3. JVM Heap配置
通常所说的heap指的是Young Generation和old generation的和。JVM生成的所有新对象都在新域中,经过一定次数的GC后进入旧域。
3.1 配置heap size
-Xms128M:初始堆大小
-Xmx128M:最大堆大小(通常将初始堆设置成和最大值一大,这样可以避免动态的加载堆的大小)。
3.2 配置新域与旧域
-Xmn:设置新域的大小
-XX:NewSize : 设置新域的初始值
-XX:MaxNewSize: 设置新域的最大值
-XX:NewRatio=3: 设置新域与旧域的比例
3.3 配置永久区域
-XX:MaxPerSize=64m: 设置永久区域大小。
-XX:PerSize=64m: 设置永久域初始大小。
3.4 配置新域子空间
-XX:SurvivorRatio=2: 可控制新域中from/to空间的大小。这里2表示Eden:from:to的比例为2:1:1
-XX:TargetSurvivorRatio: 控制survivor空间的使用比例,默认50,即50%。 
-XX:MaxTenuringThreashold=0: 控制survivor空间使用上限,如果设为0即不再使用survivor空间。
具体设置成多少,取决于在两个survivor空间反复复制和压缩旧域那个成本大。通常复制小部分对象的成本要比压缩旧域廉价。如果旧域充满的时候将会触发一次full GC.


4. GC性能实战参考

对于GC的性能有2个方面的指标:吞吐量(工作时间不算GC占总的时间比)和暂停(GC发生时app对外显示的无法响应)

一般的OLTP系统通常要求大吞吐量,但是对暂停可容忍,而实时系统通常对暂停有很高要求但是对吞吐量可以容忍。一个对APP流畅性影响因素是young generation的大小。Young越大,minor的collection越少,但是在heap size固定的情况下,young generation意味着小的tenured generation,也意味着更到的major collection(触发Full GC).

4.1 无论是对于响应时间优先还是吞吐量优先的应用,Young Generation都应该尽可能的设大,从而避免1. Minor GC频繁,2. 对象直接进入Tenured Generation而触发Full GC.

4.2 对于响应优先的应用,Tenured generation的堆设置过大会造成较长时间收集,较小会造成内存碎片以及Full GC。对于吞吐量优先的应用,一般有一个大的young generation和一个小的tenured generation. 这样可以让大部分短期对象在新域中被回收掉。

4.3 使用CMS的好处是用尽量少的新生代,老生代利用CMS进行并行收集,这样保证系统低延迟的效率。

4.4 针对OutOfMemory问题的主要调节办法是设定Java堆的最大尺寸

4.5 注意使用对象缓存,而不是建立新对象。 使用了缓存那么年老代应该大一点,缓存的HashMap不应该无限制长。
4.6 Java heap size不要超过80%的物理内存
4.7 -Xms和-Xmx设置成相同,避免动态增加。
4.8 新域的大小一般设置为整个heap size的1/4, 新域的垃圾回收应该占据整个JVM回收的70%以上。
4.9 新域设置的大小决定在新域中被回收的对象的多少,新域小的回收对象多因为放不下,新域大的自然就回收的少。

5. 参考性能数据:
1G的内存,单CPU的配置如下:
-Xms:800m -Xmx800m
-Xmn:200m
-XX:PerSize=128m
-XX:MaxPerSize=128m
-XX:NewSize=200m (新域的值增大可减少full GC的次数)
-XX:MaxNewSize=200
-XX:NewRatio=3
-XX:SurvivorRatio=4
-XX:userParNewGC (设置并行收集)
-XX:ParallelGCThreads(设置并行收集的线程数)
-XX:UseParallelGC(使用并行清除GC)

-XX:UseAdaptiveSizePolicy(自动优化新域大小及survivor空间比值)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值