jvm优化概览

1.今日内容
了解下我们为什么要学习JVM优化
掌握jvm的运行参数以及参数的设置
掌握jvm的内存模型(堆内存)
掌握jamp命令的使用以及通过MAT工具进行分析
掌握定位分析内存溢出的方法
掌握jstack命令的使用
掌握VisualJVM工具的使用

我们为什么要对jvm做优化?
运行的应用“卡住了”,日志不输出,程序没有反应
服务器的CPU负载突然升高
在多线程应用下,如何分配线程的数量?
……

jvm的运行参数
标准参数,-server与-client参数
-X参数 (非标准参数),在不同版本的jvm中,参数可能会有所不同,、-Xint、-Xcomp、-Xmixed
-XX参数(使用率较高)-XX参数也是非标准参数,主要用于jvm的调优和debug操作。
-XX参数的使用有2种方式,一种是boolean类型,:-XX:+DisableExplicitGC 表示禁用手动调用gc操作。一种是非boolean类型:如:-XX:NewRatio=1 表示新生代和老年代的比值。
-Xms与-Xmx分别是设置jvm的堆内存的初始大小和最大大小。
-Xmx2048m:等价于-XX:MaxHeapSize,设置JVM最大堆内存为2048M。
-Xms512m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为512M。

查看jvm的运行参数:
第一,运行java命令时打印出运行参数;-XX:+PrintFlagsFinal
第二,查看正在运行的java进程的参数;jinfo ‐flags 6219

jvm的内存模型
jvm的内存模型在1.7和1.8有较大的区别

jdk1.7的堆内存模型:
Young 年轻区(代)Tenured 年老区Perm 永久区Virtual区:最大内存和初始内存的差值,就是Virtual区。

jdk1.8的堆内存模型:
,jdk1.8的内存模型是由2部分组成,年轻代 + 年老代。
年轻代:Eden + 2*Survivor
年老代:OldGen
在jdk1.8中变化最大的Perm区,用Metaspace(元数据空间)进行了替换。
需要特别说明的是:Metaspace所占用的内存空间不是在虚拟机内部,而是在本地内存
空间中,这也是与1.7的永久代最大的区别所在。

为什么要废弃1.7中的永久区
现实使用中,由于永久代内存经常不够用或发生内存泄露,爆出异常
java.lang.OutOfMemoryError: PermGen。
基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。

通过jstat命令进行查看堆内存使用情况
查看class加载统计jstat ‐class 6219
查看编译统计jstat ‐compiler 6219
垃圾回收统计jstat ‐gc 6219(包含了垃圾回收的情况和每个区的当前情况)

jmap的使用以及内存溢出分析
前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容,如:内存使用情况的汇总、对内存溢出的定位与分析。
查看内存使用情况jmap ‐heap 6219
查看内存中对象数量及大小jmap ‐histo:live 6219 | more
将内存使用情况dump到文件中jmap ‐dump:format=b,file=/tmp/dump.dat 6219
通过jhat对dump文件进行分析jhat ‐port 9999 /tmp/dump.dat  打开浏览器进行访问:http://192.168.40.133:9999/
通过MAT工具对dump文件进行分析,它可以帮助我们查找内存泄漏和减少内存消耗。从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,
看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

jstack的使用
有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增高了、出现了死锁、死循环等,我们该如何分析呢?
由于程序是正常运行的,没有任何的输出,从日志方面也看不出什么问题,所以就需要看下jvm的内部线程的执行情况,然后再进行分析查找出原因。
这个时候,就需要借助于jstack命令了,jstack的作用是将正在运行的jvm的线程情况进行快照,并且打印出来。

VisualVM工具的使用
VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。其作用有:
查看本地进程
查看CPU、内存、类、线程运行信息
查看线程详情
抽样器可以对CPU、内存在一段时间内进行抽样,以供分析。
VisualJVM不仅是可以监控本地jvm进程,还可以监控远程的jvm进程,需要借助于JMX技术实现。JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。

今日内容
了解什么是垃圾回收
掌握垃圾会回收的常见算法
学习串行、并行、并发、G1垃圾收集器
学习GC日志的可视化查看

什么是垃圾回收?
管理和回收内存资源

常见的垃圾回收算法有:引用计数法、标记清除法、标记压缩法、复制算法、分代算法等。

前面我们讲了垃圾回收的算法,还需要有具体的实现,在jvm中,实现了多种垃圾收集器,包括:串行垃圾收集器、并行垃圾收集器、CMS(并发)垃圾收集器、G1垃圾收集器。

CMS垃圾回收器的执行过程如下:
初始化标记(CMS-initial-mark) ,标记root,会导致stw;
并发标记(CMS-concurrent-mark),与用户线程同时运行;
预清理(CMS-concurrent-preclean),与用户线程同时运行;
重新标记(CMS-remark) ,会导致stw;
并发清除(CMS-concurrent-sweep),与用户线程同时运行;
调整堆大小,设置CMS在清理之后进行内存压缩,目的是清理内存中的碎片;
并发重置状态等待下次CMS的触发(CMS-concurrent-reset),与用户线程同时运行;

G1中提供了三种模式垃圾回收模式,Young GC、Mixed GC 和 Full GC,在不同的条件下被触发。

Young GC主要是对Eden区进行GC,它在Eden空间耗尽时会被触发。
MixedGC什么时候触发? 由参数 -XX:InitiatingHeapOccupancyPercent=n 决定。默认:45%,该参数的意思是:当老年代大小占整个堆大小百分比达到该阀值时触发。
fullGC什么时候触发?
G1在对象复制/转移失败或者没法分配足够内存(比如巨型对象没有足够的连续分区分配)时,会触发FullGC。FullGC使用的是stop the world的单线程的Serial Old模式,
所以一旦触发FullGC则会STW应用线程,并且执行效率很慢。JDK 8版本的G1是不提供Full gc的处理的。对于G1 GC的优化,很大的目标就是没有FullGC。

可视化GC日志分析工具
‐XX:+UseG1GC ‐XX:MaxGCPauseMillis=100 ‐Xmx256m ‐XX:+PrintGCDetails ‐
XX:+PrintGCTimeStamps ‐XX:+PrintGCDateStamps ‐XX:+PrintHeapAtGC ‐
Xloggc:F://test//gc.log
运行后就可以在E盘下生成gc.log文件。

可视化工具GC Easy是一款在线的可视化工具http://gceasy.io/ 上传后,点击“Analyze”按钮,即可查看报告。


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值