JVM基础知识及性能调优PPT学习课件
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
➢老年代GC ( Full GC / Major GC ):指发生在老年代的GC, Major GC 的速 度一般要比Minor GC 慢10倍以上;
➢一般而言,新生代回收的频率高,但是每次回收的耗时都很短,而老 年代回收的频率低,但是会消耗更多的时间(演示NewSizeDemo2及 visualVM);
JVM基本参数
含义
初始堆大小
默认值
物理内存的1/64(<1GB)
最大堆大小
物理内存的1/4(<1GB)
年轻代大小(1.4or lator)
设置年轻代大小(for 1.3/1.4)
年轻代最大值(for 1.3/1.4)
设置永久代(perm gen)初始值
物理内存的1/64
设置永久代最大值
物理内存的1/4
➢标记—清除算法是基础的收集算法,标记和清除阶段的效率不高,而且清除
后回产生大量的不连续空间,这样当程序需要分配大内存对象时,可能无法 找到足够的连续空间;
2020/3/1
34
标记清除法( Mark-Sweep )
2020/3/1
35
标记压缩法( Mark-Compat)
➢标记—整理算法是在标记-清除的算法之上进行一下压缩空间,重 新移动对象的过程。但是标记—整理算法不是把存活对象复制到 另一块内存,而是把存活对象往内存的一端移动,然后直接回收 边界以外的内存;
JVM日志参数
含义
输出GC日志 输出GC的详细日志 输出GC的时间戳(以基准时间的形式) 输出GC的时间戳(以日期的形式输出 在进行GC的前后打印出堆的信息
2020/3/1
20
GC日志
• 典型的GC日志: • 33.125: [GC [DefNew: 3324K->152K(3712K), 0.0025925 secs] 3324K-
2020/3/1
9
年轻代内存的设置
➢两个重要参数: • SurvivorRatio=eden/from=eden/to 伊甸园空间和幸存者空间的比值; • NewRatio=tenured/young 老年代内存和年轻代内存比值;
➢设置策略:
• 尽可能将对象预留在新生代; • 减少老年代GC次数; • 演示NewSizeDemo1;
JVM常见错误及调优示例
2020/3/1
30
垃圾回收算法
➢复制算法( Copying )
➢标记清除法( Mark-Sweep )
➢标记压缩法( Mark-Compat)
➢分代算法( Generational Collection )
2020/3/1
31
复制算法(Copying)
➢复制算法把内存分配为两个空间,一个空间(A)用来负责装载 正常的对象信息,另外一个内存空间(B)是垃圾回收用的;
垃圾回收算法
内存回收具体实现
垃圾回收器
2020/3/1
39
垃圾回收器
2020/3/1
40
从三个维度理解垃圾回收器
回收算法
垃圾收集器
2020/3/1
内存年代
线程
41
Serial收集器
➢单线程的收集器; ➢对于单个CPU环境,Serial收集器由于没有线程交互的开销可
以获得最高的单线程收集效率; ➢它是虚拟机运行在Client模式下的默认新生代收集器; ➢缺点是因为单线程GC,会造成中断的时间(Sop-the-world)
➢MaxTenuringThreshold用于控制对象能经历多少次Minor GC才晋升到旧生代;
➢每发生一次Minor GC,年龄就增加1岁,当它的年龄增加到临界值(默认为 15岁),就将会被晋升到老年代中;
2020/3/1
12
年轻代向老年代的转变
Minor GC
年轻代
是否达到 临界值
Y
老年代
N,Age+1
2020/3/1
17
参数名称
-Xms -Xmx -Xmn -XX:NewSize -XX:MaxNewSize -XX:PermSize -XX:MaxPermSize -Xss -XX:NewRatio
-XX:SurvivorRatio -XX:MaxDirectMemorySize
2020/3/1
2020/3/1
21
GC日志
• “[DefNew”、“[Tenured”、“[Perm”表示GC发生的区域,这 里显示的区域名称与使用的GC收集器是密切相关的,例如上面样 例所使用 的Serial收集器中的新生代名为“Default New Generation”,所以显示的是“[DefNew”。如果是ParNew收集器, 新生代名称就会变为“[ParNew”,意为“Parallel New Generation”。如果采用Parallel Scavenge收集器,那它配套的新生 代称为“PSYoungGen”,老年代和永久代同理,名称也是由收集 器决定的。
2020/3/1
7
年轻代
➢新生成的对象首先都是分配在年轻代的;
➢年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象;
2020/3/1
8
JVM年轻代的结构
➢Eden:Eden用来存放JVM刚分配的对象;
➢Survivor1 和Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾 回收没有被回收掉时,会在两个Survivor之间来回 Copy,当满足某个条件, 比如Copy次数,就会被Copy到Tenured;
每ቤተ መጻሕፍቲ ባይዱ线程的堆栈大小
年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)
Eden区与Survivor区的大小比值 设置最大可用直接内存大小
18
垃圾收集器参数
参数名称
-XX:+UseSerialGC -XX:+UseParallelGC -XX:ParallelGCThreads -XX:+UseParallelOldGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+UseG1GC
➢标记—整理算法提高了内存的利用率,并且它适合在收集对象存 活时间较长的老年代;
2020/3/1
36
标记压缩法( Mark-Compat)
2020/3/1
37
分代算法
内存分代
新生代(复制算法)
老年代(标记清除算 法、标记压缩算法)
2020/3/1
38
垃圾回收算法 VS 垃圾回收器
内存回收算法理论
➢内存分析工具MAT
➢图形化虚拟机监控工具Jconsole
2020/3/1
26
VisualVM介绍
➢VisualVM官网
➢Java VisualVM默认没有安装Visual GC插件,需要手动安装,JDK的 安装目录的bin目录下双击jvisualvm.exe
3
JVM堆空间布局
2020/3/1
4
JVM的分代
年轻代 老年代 永久代
2020/3/1
5
为什么分代
➢不同类型对象的生命周期是不一样的;
➢不同年代的对象采取不同的收集方式,以便提高回收效率;
2020/3/1
6
为什么分代
➢如果不分代,每次垃圾回收都需要遍历内存空间,花费时间较长,效率低;
➢如果不分代,多次垃圾回收后,生命周期长的对象仍然存在,效率低;
2020/3/1
10
老年代
➢在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到老年代;
➢老年代中存放的都是一些生命周期较长的对象,例如: Session对象、Socket 连接等;
2020/3/1
11
MaxTenuringThreshold
➢MaxTenuringThreshold是年轻代和老年代的临界值;
比较大;
2020/3/1
42
Serial Old 收集器
➢Serial Old是Serial 收集器的老年代版本;
➢Serial Old 同样是单线程收集器,使用“标记压缩”算法;
➢它是虚拟机运行在Client模式下的默认新生代收集器;
2020/3/1
43
Serial/ Serial Old收集器运行示意图
➢每次把空间A中存活的对象全部复制到空间B里面,在一次性的把 空间A删除;
➢复制算法对内存要求比较大,内存的利用率比较低。适用于短生 存期的对象,持续复制长生存期的对象则导致效率降低;
2020/3/1
32
复制算法(Copying)
2020/3/1
33
标记清除法( Mark-Sweep )
➢标记—清除算法包括两个阶段:“标记”和“清除”。在标记阶段,确定所 有要回收的对象,并做标记。清除阶段紧随标记阶段,将标记阶段确定不可 用的对象清除;
➢直接内存跳过了java堆,使java程序可以直接访问原生内存空间, 因此,直接内存访问速度会快于堆内存;
➢直接内存适合申请次数较少,访问较频繁的场合。如果内存空间 本身需要平衡申请,则不适合使用直接内存,参考代码示例: AccessDirectBuffer和AccessDirectBuffer2;
含义
串行垃圾回收器 并行垃圾回收器 并行收集器的线程数 年老代垃圾收集方式为并行收集 设置年老代为并发收集 设置年轻代为并行收集 使用G1垃圾回收器
2020/3/1
19
参数名称
-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC
JVM基础知识及性能调优
2016.06.27
1
JVM基础知识及性能调优
JVM基本结构 JVM的重要概念及相关参数 JVM工具 垃圾回收算法、垃圾收集器
JVM常见错误及调优示例
2020/3/1
2
Java虚拟机的基本结构
堆空间
直接内存
垃圾回收系统
Java栈 本地方法栈 PC寄存器
执行引擎
2020/3/1
>152K(11904K), 0.0031680 secs] • 100.667: [Full GC [Tenured: 0K->210K(10240K), 0.0149142 secs]
4603K->210K(19456K), [Perm : 2999K->2999K(21248K)], 0.0150007 secs] [Times: user=0.01 sys=0.00, real=0.02 secs] • 最前面的数字“33.125:”和“100.667:”代表了GC发生的时间, 这个数字的含义是从Java虚拟机启动以来经过的秒数。
2020/3/1
44
ParNew 收集器
➢ParNew收集器是Serial收集器的多线程版本;
➢ParNew收集器运行示意图:
2020/3/1
45
CMS收集器
➢CMS( Concurrent Mark Sweep ) 收集器是以获得最短响应时间为目标的收集器; ➢CMS过程:初始标记、并发标记、重新标记、并发清除; ➢CMS收集器运行示意图:
2020/3/1
15
JVM基础知识及性能调优
JVM基本结构 JVM的重要概念、相关参数、日志 JVM工具 垃圾回收算法、垃圾收集器
JVM常见错误及调优示例
2020/3/1
16
Minor GC、Full GC
➢新生代GC( Minor GC ) : 指发生在新生代的GC,Minor GC非常频繁,一 般回收速度也比较快;
2020/3/1
27
VisualVM介绍
2020/3/1
28
运用VisualVM调优
➢运用VisualVM的快照查看耗时方法的具体时间及调用次数、CPU、 内存占用情况,分析问题,解决问题;
➢参考示例: CpuTest和历史邮件;
2020/3/1
29
JVM基础知识及性能调优
JVM基本结构 JVM的重要概念、相关参数、日志 JVM工具 垃圾回收算法、垃圾收集器
2020/3/1
22
接口响应时间过长
2020/3/1
23
日志分析-Full GC
2020/3/1
24
JVM基础知识及性能调优
JVM基本结构 JVM的重要概念、相关参数、日志 JVM工具 垃圾回收算法、垃圾收集器
JVM常见错误及调优示例
2020/3/1
25
JVM性能相关分析工具
➢可视化性能监控工具 Visual VM
2020/3/1
13
永久代(持久代)内存
➢永久代内存用于保存类信息。方法区的大小决定了系统可以保存 多少个类;
➢如果定义了太多的类,会导致永久代内存溢出,参考代码示例 PermTest ;
➢在JDK1.8中,废弃永久代,取而代之的是元数据区(Metaspace) ;
2020/3/1
14
直接内存
➢直接内存常用于使用NIO的场景,例如:mina,netty框架;参考 DirectBufferOOM、ByteBuffer ;