内存相关
1、哪些内存区域是共享的,哪些又是线程私有的?
共享的:方法区、堆
私有的:栈、本地栈、程序计数器
2、哪个内存区域不会有OOM?
程序计数器
3、哪个区域会有StackOverFlowError?
域区与本地栈
GC相关
1、如何打开GC日志?
参考:http://ifeve.com/useful-jvm-flags-part-8-gc-logging/
这个地方还有系列介绍参数的博文值得一看
-XX:+PrintGC 简单日志
-XX:PrintGCDetails 详细参数
-XX:+PrintGCTimeStamps和-XX:+PrintGCDateStamps 日期、时间戳
-Xloggc 指定GC日志输出文件
2、如何看懂GC日志?
GC日志与收集器关系很大,不同的收集器日志格式不一样,但是基本的共性数值还有是有:
回收类型(Minor Or Full GC,后者会Stop The World)、什么时间点发生、
特定区域(如年轻代)回收前后内存大小对比、堆内存回收前后内存大小的对比、运行时长等;
观察这些参数就可以判断GC的相关操作情况。
3、不同收集器的表格整理
收集器 | 多线程 | 回收区域 | 回收算法 | 特点 | 缺点 | 可以配合回收器 |
Serial | 否 | 新生代 | 复制 | 运行在Client模式下,简单高效 | 单线程,不适合运行在高性能的服务器上 | Serial Old CMS |
ParNew | 是 | 新生代 | 复制 | Serial多线程实现 | 暂无 | Serial Old CMS |
Parallel Scavenge | 是 | 新生代 | 复制 | 吞吐量优先、有参数可以控制吞吐量,最大停顿时间,还可以设置自适应调节vm参数 | 暂无 | Serial Old Parallel Old |
CMS | 是 | 老年代 | 标记-清除 | 设计目标是低停顿、可以与用户线程(几乎)并发执行 | 1、CPU资源敏感 2、无法处理浮动垃圾(收集过程中产生的新垃圾) 3、标记-清除算法会有碎片产生(顶不住要进行FullGC时会触发碎片整理) | Serial ParNew Serial Old(CMF) |
Serial Old | 否 | 老年代 | 标记-整理 | Serial老年代实现、也比较适合在client模式下使用 | 单线程,不适合运行在高性能的服务器上 | Serial ParNew Parallel Scavenge |
Parallel Old | 是 | 老年代 | 标记-整理 | Parallel的老年代实现,也是吞吐量优先的算法 | 暂无 | Parallel Scavenge |
G1 | 是 | 所有 | 标记-整理,局部也类似有复制算法 | 1、设计目标是低停顿,与CMS相同 2、并发与并行都可以 3、分代收集概念得以保留,虽然不需要其它收集器配合 4、标记-整理算法,没有垃圾 降低停顿,几乎可以预测的停顿时间模型,CMS无法预测 | 暂无 | 不需要配合 |
3.1、不同的收集器组合的适用场景是什么?各有什么优缺点。
组合 | 适用场景 |
Serial Serial Old | 单线程回收,适合在client模式下小内存,简单快速回收 |
ParNew CMS | 适合在高性能服务器上实现低停顿的垃圾回收,如B/S服务器等 |
Parallel Scavenge Parallel Old | 适合在高性能服务器上实现CPU敏感以及吞吐量优先的垃圾回收,比如大量计算的程序 |
4、诊断JVM故障时一般的步骤是什么?
查看日志:应用程序日志、GC日志;
查看堆内存转储文件,分析异常内存占用:jmap转储;
查看异常调用堆栈信息:jstack
VisualVm实时查看vm信息;
分析堆内存转储文件:Eclipse Heap Analysis Tools;
4.1、优化手段
应用程序优化;
服务器硬件升级;
调整VM参数;
32位替换64位vm,并开多个虚拟机等;
5、垃圾收集器按回收区域分类是怎么样的?
年轻代收集器:Serial/ParNew/Parallel Scavenge
老年代收集器:CMS/Serial Old/Parallel Old
整个堆收集器:G1
参考博客:http://blog.csdn.net/u010723709/article/details/47355499
搜索jvm垃圾收集器关系图即可