Mercurial HG
分布式软件配置管理工具 - 水银
首先花2分钟了解一下HotSpot使用的版本管理工具,能够简单理解为GIThtml
基本命令:
add add the specified files on the next commit
annotate show changeset information by line for each file
clone make a copy of an existing repository
commit commit the specified files or all outstanding changes
diff diff repository (or selected files)
export dump the header and diffs for one or more changesets
forget forget the specified files on the next commit
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge another revision into working directory
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
serve start stand-alone webserver
status show changed files in the working directory
summary summarize working directory state
update update working directory (or switch revisions)
下载HotSpot源码
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u60/hotspot/
HotSpot源码分析
cpu:
os:
os_cpu:
share:
tools:
vm:
gc_implementation:
concurrentMarkSweep:
g1:
parallelScavenge:
parNew:
shared:
OOP-Klass模型
- OOP Ordinary Object Pointer
- Klass 由于class在C++中是关键字,因此叫Klass
内存占用
回收
分代
年轻代
老年代
永久代
永久代并非永久存在的,这么叫是历史缘由。
收集器
低延时
高吞吐
- Maximum pause time goal
- Throughput goal
- Minimum footprint goal
除非有停顿问题,不然因尽可能知足内存。默认大小一般设置特别小。java
- server
- client
分代参数web
参数 |
描述 |
默认值 |
-XX:MinHeapFreeRatio |
堆内存初始空闲比例 |
|
-XX:MaxHeapFreeRatio |
堆内存最大空闲比例 |
|
-Xms |
堆内存初始值 |
物理内存1/64 |
-Xmx |
堆内存最大值 |
物理内存1/4 |
-Xmn |
年轻代大小 |
|
-XX:NewSize |
年轻代初始值 |
|
-XX:MaxNewSize |
年轻代最大值 |
|
-XX:NewRatio |
年轻代/老年代比例 |
|
-XX:SurvivorRatio |
Eden区/Survivor区比例 |
|
-XX:PermSize |
持久代初始值 |
|
-XX:MaxPermSize |
持久代最大值 |
|
GC选择算法
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:-UseParallelOldGC
-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
GC参数shell
-XX:MaxGCPauseMillis=<N>
-XX:GCTimeRatio=<N> 垃圾回收时间/程序运行时间
-Xmx<N
Excessive GC Time and OutOfMemoryError 过分GC形成OOM服务器
-XX:-UseGCOverheadLimit
-
JVM调优参数
- XX:MaxTenuringThreshold 垃圾最大存活年龄,年龄指复制算法一次或标记等
- XX:TargetsurvivorRatio
- Xss 线程所占堆栈大小-XX:ThreadStackSize
新生代垃圾收集器
- 单线程
- 适合客户端应用
- 简单高效
- 采用“复制算法”
- 多线程并行
- 多CPU服务器环境,单CPU环境不如Serial
- 追求“下降停顿时间”
- 采用“复制算法”
- 多线程版本的Serial,目的是缩短GC时间,减小用户停顿时间
- 多线程并行
- 采用“复制算法”
- 对比ParNew收集器,ParNew追求下降用户线程的停顿时间,适合交互式应用;而Paraller Scavenge追求CPU吞吐量,适合没有交互的后台应用
- Parallel Scavenge提供的参数
- 设置“吞吐量”
经过参数-XX:GCTimeRadio设置垃圾回收时间占总CPU时间的百分比。
- 设置“停顿时间”
经过参数-XX:MaxGCPauseMillis设置垃圾处理过程最久停顿时间。Parallel Scavenge会根据这个值的大小肯定新生代的大小。若是这个值越小,新生代就会越小,从而收集器就能以较短的时间进行一次回收。但新生代变小后,回收的频率就会提升,所以要合理控制这个值。
- 启用自适应调节策略
经过命令-XX:+UseAdaptiveSizePolicy就能开启自适应策略。咱们只要设置好堆的大小和MaxGCPauseMillis或GCTimeRadio,收集器会自动调整新生代的大小、Eden和Survior的比例、对象进入老年代的年龄,以最大程度上接近咱们设置的MaxGCPauseMillis或GCTimeRadio。
老年代垃圾收集器
- Serial收集器的老年代版本
- 标记-整理算法
- Parallel Scavenge的老年代版本
- CMS收集器是一款追求停顿时间的老年代收集器,它在垃圾收集时使得用户线程和GC线程并行执行,所以在垃圾收集过程当中用户也不会感觉到明显的卡顿。但用户线程和GC线程之间不停地切换会有额外的开销,所以垃圾回收总时间就会被延长。
- 垃圾回收过程
- 初始标记
中止一切用户线程,仅使用一条初始标记线程对全部与GC ROOTS直接关联的对象进行标记。速度很快。
- 并发标记
使用多条并发标记线程并行执行,并与用户线程并发执行。此过程进行可达性分析,标记出全部废弃的对象。速度很慢。
- 从新标记
中止一切用户线程,并使用多条从新标记线程并行执行,将刚才并发标记过程当中新出现的废弃对象标记出来。这个过程的运行时间介于初始标记和并发标记之间。
- 并发清除
只使用一条并发清除线程,和用户线程们并发执行,清除刚才标记的对象。这个过程很是耗时。
- CMS的缺点
- 吞吐量低
因为CMS在垃圾收集过程使用用户线程和GC线程并行执行,从而线程切换会有额外开销,所以CPU吞吐量就不如在垃圾收集过程当中中止一切用户线程的方式来的高。
- 没法处理浮动垃圾,致使频繁Full GC
因为垃圾清除过程当中,用户线程和GC线程并发执行,也就是用户线程仍在执行,那么在执行过程当中会产生垃圾,这些垃圾称为“浮动垃圾”。
若是CMS在垃圾清理过程当中,用户线程须要在老年代中分配内存时发现空间不足时,就须要再次发起Full GC,而此时CMS正在进行清除工做,所以此时只能由Serial Old临时对老年代进行一次Full GC。
- 使用“标记-清除”算法产生碎片空间
因为CMS使用了“标记-清除”算法, 所以清除以后会产生大量的碎片空间,不利于空间利用率。
-不过CMS提供了应对策略:
开启-XX:+UseCMSCompactAtFullCollection
开启该参数后,每次FullGC完成后都会进行一次内存压缩整理,将零散在各处的对象整理到一起。但每次都整理效率不高,所以提供了如下参数。
设置参数-XX:CMSFullGCsBeforeCompaction
本参数告诉CMS,通过了N次Full GC事后再进行一次内存整理。
通用垃圾收集器——G1垃圾收集器
- 追求停顿时间
- 多线程GC
- 面向服务端应用
- 标记-整理和复制算法合并
- 不会产生碎片内存。
- 可对整个堆进行垃圾回收
- 可预测停顿时间
-
G1的内存模型
- Region G1垃圾收集器没有新生代和老年代的概念了,而是将堆划分为一块块独立的Region。当要进行垃圾收集时,首先估计每一个Region中的垃圾数量,每次都从垃圾回收价值最大的Region开始回收,所以能够得到最大的回收效率。
- Remembered Set
个对象和它内部所引用的对象可能不在同一个Region中,那么当垃圾回收时,是否须要扫描整个堆内存才能完整地进行一次可达性分析? 固然不是,每一个Region都有一个Remembered Set,用于记录本区域中全部对象引用的对象所在的区域,从而在进行可达性分析时,只要在GC ROOTs中再加上Remembered Set便可防止对全部堆内存的遍历。
-
G1垃圾收集过程
- 初始标记 标记与GC ROOTS直接关联的对象,中止全部用户线程,只启动一条初始标记线程,这个过程很快。
- 并发标记 进行全面的可达性分析,开启一条并发标记线程与用户线程并行执行。这个过程比较长。
- 最终标记 标记出并发标记过程当中用户线程新产生的垃圾。中止全部用户线程,并使用多条最终标记线程并行执行。
- 筛选回收 回收废弃的对象。此时也须要中止一切用户线程,并使用多条筛选回收线程并行执行。
延伸阅读