Java虚拟机 相关概念
时间:2017-08-12 17:12:54
参考:
- [周志明]深入理解JAVA虚拟机
内存分区#
- 程序计数器 :当前执行的指令地址。
- 虚拟机栈:当前线程执行的方法的 参数入口、返回地址等。
- 本地虚拟机栈: 类似于虚拟机栈。
- 堆: 储存创建的对象,分为新生代和老年代。新创建的对象会放入新生代,经历过几次GC之后还没有被清除的对象会被放在老年代。
- 方法区: 类、常量和类静态变量。
垃圾收集器#
垃圾回收器种类#
- 新生代
- Serial: 单线程运行,执行的时候需要暂停虚拟机正在执行的所有任务
Stop The World
。使用于客户端模式和单核电脑。 - ParNew: Serial 回收器的多线程版本。
- Parallel Scavenge: 吞吐量优先,通过参数设置需要满足的吞吐量回收器自动调节堆内存分配。
- Serial: 单线程运行,执行的时候需要暂停虚拟机正在执行的所有任务
- 老年代
- CMS (Concurrent Make Sweep): 并行执行标记清理算法。
- Serial Old: Serial 回收器的老年代版本。
- Parallel Old: Parallel 回收器的老年代版本。
- 新生代和老年代公用:
- G1:把堆内分成不同的
Region
根据配置,垃圾回收是在对应的Region
进行。
- G1:把堆内分成不同的
垃圾回收器配置#
-XX:+UseSerialGC
新生代使用Seriol
老年代使用Serial Old
。-XX:+UseParnNewGC
新生代使用ParNew
老年代使用Serial Old
。-XX:+UseConcMarkSweepGC
新生代使用ParNew
老年代使用CMS
。-XX:+UseParallel
新生代使用Parallel Scavenge
老年代使用Serial Old
。-XX:UseParallelOldGC
新生代使用Parallel Scavenge
老年代使用Parallel Old
。-XX:SurvivorRatio
新生代Eden
区域和Survivor
区域比率配置。-XX:PretenureSizeThreshold
直接晋升到老年代的对象大小。-XX:MaxTenuringThreshold
晋升到老年代对象的年龄。-XX:UseAdapttiveSizePolicy
动态调整Java堆中各区域大小以及进入老年代的年龄。-XX:HandlePromotionFailure
是否允许担保失败,当老年代剩余空间进行担保不足时,是否尝试进行担保,如果失败则会执行Full GC
。-XX:ParallelGCThreads
并行GC时的内存回收线程数。-XX:GCTimeRatio
GC 占总时间的比值,默认 99%,即允许 1% 的GC时间。在Parallel Scavenge
垃圾收集器有用。-XX:MaxGcPauseMillis
最大GC停顿时间,在Parallel Scavenge
垃圾收集器有用。-XX:CMSInitiatingOccupaneyFraction
CMS 在老年代占用超过多少时进行垃圾回收,默认 68%。-XX:UseCMSCompactAtFullCollection
设置 CMS 是否在垃圾回收完成时进行一次内存整理。-XX:CMSFullGcsBeforeCompaction
设置 CMS 在若干次垃圾回收后再进行内存整理。