没有合适的资源?快使用搜索试试~ 我知道了~
①系统运行日志:系统运行日志就是在程序代码中打印出的日志,描述了代码级别的系统运行轨迹(执行的方法、入参、返回值等),一般系统出现问题,系统运行日志是首先要查看
资源详情
资源评论
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/86355818/bg1.jpg)
https://blog.csdn.net/weixin_42447959/article/details/81637909?ivk_sa=1024
320u
1、JVM 调优目标:使用较小的内存占用来获得较高的吞吐量或者较低的延
迟。
程序在上线前的测试或运行中有时会出现一些大大小小的 JVM 问题,比如
cpu load 过高、请求延迟、tps 降低等,甚至出现内存泄漏(每次垃圾收集
使用的时间越来越长,垃圾收集频率越来越高,每次垃圾收集清理掉的垃圾
数据越来越少)、内存溢出导致系统崩溃,因此需要对 JVM 进行调优,使
得程序在正常运行的前提下,获得更高的用户体验和运行效率。
这里有几个比较重要的指标:
�
内存占用:程序正常运行需要的内存大小。
�
�
延迟:由于垃圾收集而引起的程序停顿时间。
�
�
吞吐量:用户程序运行时间占用户程序和垃圾收集占用总时间的比
值。
�
当然,和 CAP 原则一样,同时满足一个程序内存占用小、延迟低、高吞吐
量是不可能的,程序的目标不同,调优时所考虑的方向也不同,在调优之前,
必须要结合实际场景,有明确的的优化目标,找到性能瓶颈,对瓶颈有针对
性的优化,最后进行测试,通过各种监控工具确认调优后的结果是否符合目
标。
2、JVM 调优工具
(1)调优可以依赖、参考的数据有系统运行日志、堆栈错误信息、gc 日志、
线程快照、堆转储快照等。
![](https://csdnimg.cn/release/download_crawler_static/86355818/bg2.jpg)
①系统运行日志:系统运行日志就是在程序代码中打印出的日志,描述了
代码级别的系统运行轨迹(执行的方法、入参、返回值等),一般系统出现
问题,系统运行日志是首先要查看的日志。
②堆栈错误信息:当系统出现异常后,可以根据堆栈信息初步定位问题所
在,比如根据“java.lang.OutOfMemoryError: Java heap space”可以判断是
堆内存溢出;根据“java.lang.StackOverflowError”可以判断是栈溢出;根据
“java.lang.OutOfMemoryError: PermGen space”可以判断是方法区溢出等。
③GC 日志:程序启动时用 -XX:+PrintGCDetails 和
-Xloggc:/data/jvm/gc.log 可以在程序运行时把 gc 的详细过程记录下来,或
者直接配置“-verbose:gc”参数把 gc 日志打印到控制台,通过记录的 gc 日志
可以分析每块内存区域 gc 的频率、时间等,从而发现问题,进行有针对性
的优化。
比如如下一段 GC 日志:
.
2018-08-02T14:39:11.560-0800: 10.171: [GC [PSYoungGen:
30128K->4091K(30208K)] 51092K->50790K(98816K), 0.0140970 secs]
[Times: user=0.02 sys=0.03, real=0.01 secs]
.
.
2018-08-02T14:39:11.574-0800: 10.185: [Full GC [PSYoungGen:
4091K->0K(30208K)] [ParOldGen: 46698K->50669K(68608K)]
50790K->50669K(98816K) [PSPermGen: 2635K->2634K(21504K)],
0.0160030 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
.
.
2018-08-02T14:39:14.045-0800: 12.656: [GC [PSYoungGen:
14097K->4064K(30208K)] 64766K->64536K(98816K), 0.0117690 secs]
[Times: user=0.02 sys=0.01, real=0.01 secs]
.
.
2018-08-02T14:39:14.057-0800: 12.668: [Full GC [PSYoungGen:
4064K->0K(30208K)] [ParOldGen: 60471K->401K(68608K)]
64536K->401K(98816K) [PSPermGen: 2634K->2634K(21504K)],
0.0102020 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
.
上面一共是 4 条 GC 日志,来看第一行日志,
“2018-08-02T14:39:11.560-0800”是精确到了毫秒级别的 UTC 通用标准时
![](https://csdnimg.cn/release/download_crawler_static/86355818/bg3.jpg)
间格式,配置了“-XX:+PrintGCDateStamps”这个参数可以跟随 gc 日志打印
出这种时间戳,“10.171”是从 JVM 启动到发生 gc 经过的秒数。第一行日志
正文开头的“[GC”说明这次 GC 没有发生 Stop-The-World(用户线程停
顿),第二行日志正文开头的“[Full GC”说明这次 GC 发生了 Stop-The-World,
所以说,[GC 和[Full GC 跟新生代和老年代没关系,和垃圾收集器的类型有
关系,如果直接调用 System.gc(),将显示[Full GC(System)。接下来的
“[PSYoungGen”、“[ParOldGen”表示 GC 发生的区域,具体显示什么名字也
跟垃圾收集器有关,比如这里的“[PSYoungGen”表示 Parallel Scavenge 收
集器,“[ParOldGen”表示 Serial Old 收集器,此外,Serial 收集器显示
“[DefNew”,ParNew 收集器显示“[ParNew”等。再往后的
“30128K->4091K(30208K)”表示进行了这次 gc 后,该区域的内存使用空间
由 30128K 减小到 4091K,总内存大小为 30208K。每个区域 gc 描述后面
的“51092K->50790K(98816K), 0.0140970 secs”进行了这次垃圾收集后,
整个堆内存的内存使用空间由 51092K 减小到 50790K,整个堆内存总空间
为 98816K,gc 耗时 0.0140970 秒。
④线程快照:顾名思义,根据线程快照可以看到线程在某一时刻的状态,
当系统中可能存在请求超时、死循环、死锁等情况是,可以根据线程快照来
进一步确定问题。通过执行虚拟机自带的“jstack pid”命令,可以 dump 出当
前进程中线程的快照信息,更详细的使用和分析网上有很多例,这篇文章写
到这里已经很长了就不过多叙述了,贴一篇博客供参考:
http://www.cnblogs.com/kongzhongqijing/articles/3630264.html
⑤堆转储快照:程序启动时可以使用 “-XX:+HeapDumpOnOutOfMemory”
和 “-XX:HeapDumpPath=/data/jvm/dumpfile.hprof”,当程序发生内存溢出
时,把当时的内存快照以文件形式进行转储(也可以直接用 jmap 命令转储
程序运行时任意时刻的内存快照),事后对当时的内存使用情况进行分析。
(2)JVM 调优工具
①用 jps(JVM process Status)可以查看虚拟机启动的所有进程、执行主
类的全名、JVM 启动参数,比如当执行了 JPSTest 类中的 main 方法后
(main 方法持续执行),执行 jps -l 可看到下面的 JPSTest 类的 pid 为
31354,加上-v 参数还可以看到 JVM 启动参数。
.
3265
.
![](https://csdnimg.cn/release/download_crawler_static/86355818/bg4.jpg)
.
32914 sun.tools.jps.Jps
.
.
31353 org.jetbrains.jps.cmdline.Launcher
.
.
31354 com.danny.test.code.jvm.JPSTest
.
.
380
.
②用 jstat(JVM Statistics Monitoring Tool)监视虚拟机信息
jstat -gc pid 500 10 :每 500 毫秒打印一次 Java 堆状况(各个区的容量、
使用容量、gc 时间等信息),打印 10 次
.
S0C S1C S0U S1U EC EU OC OU
MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
.
.
11264.0 11264.0 11202.7 0.0 11776.0 1154.3 68608.0
36238.7 - - - - 14 0.077 7 0.049
0.126
.
.
11264.0 11264.0 11202.7 0.0 11776.0 4037.0 68608.0
36238.7 - - - - 14 0.077 7 0.049
0.126
.
.
11264.0 11264.0 11202.7 0.0 11776.0 6604.5 68608.0
36238.7 - - - - 14 0.077 7 0.049
0.126
.
.
11264.0 11264.0 11202.7 0.0 11776.0 9487.2 68608.0
36238.7 - - - - 14 0.077 7 0.049
0.126
.
.
剩余18页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![avatar](https://profile-avatar.csdnimg.cn/23a776d3cb9e4f9797ffe02e4b2bb65f_weixin_35774805.jpg!1)
查理捡钢镚
- 粉丝: 21
- 资源: 317
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
- 藏区特产销售平台源代码+论文+毕业设计.zip
- B297C8EC5A69641DB3E681E1B3F894E5.mp4
- PrimitivesPro v2.2.unitypackage
- 财务管理系统源代码+论文.zip
- 高级信息通信运行管理员第七套试卷
- UModeler v2.11.6 (May 10, 2024).unitypackage
- 基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本127.0.6486.0)
- 基于FPGA的CORDIC算法旋转模式实现
- bilibili视频解析下载源码
- 基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本124.0.6367.60)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
评论0