JVM调优工具的使用方法
常用的JVM调优工具:Jconsole,jProfile,VisualVM
Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。详细说明参考这里
JProfiler:商业软件,需要付费。功能强大。详细说明参考这里
VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。
调优的方法
观察内存释放情况、集合类检查、对象树
上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能
堆信息查看
可查看堆空间大小分配(年轻代、年老代、持久代分配)
提供即时的垃圾回收功能
垃圾监控(长时间监控回收情况)
查看堆内类、对象信息查看:数量、类型等
对象引用情况查看
有了堆信息查看方面的功能,我们一般可以顺利解决以下问题:
–年老代年轻代大小划分是否合理
–内存泄漏
–垃圾回收算法设置是否合理
线程监控
线程信息监控:系统线程数量。
线程状态监控:各个线程都处在什么样的状态下
Dump线程详细信息:查看线程内部运行情况
死锁检查
热点分析
CPU热点:检查系统哪些方法占用的大量CPU时间内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)这两个东西对于系统优化很有帮助。我们可以根据找到的热点,有针对性的进行系统的瓶颈查找和优化,而不是漫无目的的进行所有代码的优化。
快照
快照是系统运行到某一时刻的一个定格。在我们进行调优的时候,不可能用眼睛去跟踪所有系统变化,依赖快照功能,我们就可以进行系统两个不同运行时刻,对象(或类、线程等)的不同,以便快速找到问题举例说,要检查系统进行垃圾回收以后,是否还有该收回的对象被遗漏的。那么就可以在进行垃圾回收前后,分别进行一次堆情况的快照,然后对比两次快照的对象情况。
内存泄漏检查
内存泄漏是比较常见的问题,而且解决方法也比较通用,这里可以重点说一下,而线程、热点方面的问题则是具体问题具体分析了。内存泄漏一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而导致新的资源分配请求无法完成,引起系统错误。内存泄漏对系统危害比较大,甚至会导致系统崩溃。需要区别一下,内存泄漏和系统超负荷两者是有区别的,虽然可能导致的最终结果是一样的。内存泄漏是用完的资源没有回收引起错误,而系统超负荷则是系统确实没有那么多资源可以分配了(其他的资源都在使用)。
年老代堆空间被占满
异常: java.lang.OutOfMemoryError: Java heap space
说明:
这是最典型的内存泄漏方式,简单说就是所有堆空间都被无法回收的垃圾对象占满,虚拟机无法再次分配新空间。如上图所示,这是非常典型的内存泄漏的垃圾回收情况图。所有峰值部分都是一次垃圾回收点,所有谷底部分表示是一次垃圾回收后剩余的内存。连接所有谷底的点,可以发现一条由底到高的线,这说明,随时间的推移,系统的堆空间被不断占满,最终会占满整个堆空间。因此可以初步认为系统内部可能有内存泄漏。(上面的图仅供示例,在实际情况下收集数据的时间需要更长,比如几个小时或者几天)
解决:
这种方式解决起来也比较容易,一般就是根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点。
持久代被占满
异常:java.lang.OutOfMemoryError: PermGen space
说明:
Perm空间被占满。无法为新的class分配存储空间而引发的异常。这个异常以前是没有的,但是在Java反射大量使用的情况下,这个异常就比较常见了。主要原因就是大量动态反射生成的类不断被加载,最终导致Perm区被占满。更可怕的是,不同的classLoader即便使用了相同的类,但是都会对其进行加载,相当于同一个东西,如果有N个classLoader那么他将会被加载N次。因此,某些情况下,这个问题基本视为无解。当然,存在大量classLoader和大量反射类的情况其实也不多。
解决:
1. -XX:MaxPermSize=16m2. 换用JDK。比如JRocket。
堆栈溢出
异常:java.lang.StackOverflowError
说明:这个就不多说了,一般就是递归没返回,或者循环调用造成
线程堆栈满
异常:Fatal: Stack size too small
说明:java中一个线程的空间大小是有限制的。JDK5.0以后这个值是1M。与这个线程相关的数据将会保存在其中。但是当线程空间满了以后,将会出现上面异常。
解决:增加线程栈大小。-Xss2m。但这个配置无法解决根本问题,还要看代码部分是否有造成泄漏的部分。
系统内存被占满
异常:java.lang.OutOfMemoryError: unable to create new native thread
说明:
这个异常是由于操作系统没有足够的资源来产生这个线程造成的。系统创建线程时,除了要在Java堆中分配内存外,操作系统本身也需要分配资源来创建线程。因此,当线程数量大到一定程度以后,堆中或许还有空间,但是操作系统分配不出资源来了,就出现这个异常了。
分配给Java虚拟机的内存越多,系统剩余的资源就越少,因此,当系统内存固定时,分配给Java虚拟机的内存越多,那么,系统总共能够产生的线程也就越少,两者成反比的关系。同时,可以通过修改-Xss来减少分配给单个线程的空间,也可以起到增加系统总共生产的线程数。
解决:
1. 重新设计系统减少线程数量。2. 线程数量不能减少的情况下,通过-Xss减小单个线程大小。以便能生产更多的线程。
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
JVM调优工具的使用方法相关推荐
- jvm调优五:jvm调优工具和调优实战
jvm调优工具和调优实战 jvm自带常用命令 JPS jps是用于查看有权访问的hotspot虚拟机的进程id. 当未指定hostid时,默认查看本机jvm进程id -l:输出完整jar名称 -v:输 ...
- jvm调优 java_opt_Java-100天知识进阶-JVM调优工具-JDK自带工具-知识铺《八》
原标题:Java-100天知识进阶-JVM调优工具-JDK自带工具-知识铺<八> JVM 监控分析工具 一.JDK 自带工具 1. jconsole JDK/bin 目录下, jconso ...
- 【JVM调优工具】JVM调优工具
一.JVM调优工具 1. jstat工具 jstat命令详解_zhaozheng7758的专栏-CSDN博客_jstat 干货:JVM 堆内存和非堆内存 - 茶轴的青春 - 博客园 [JVM]jsta ...
- jvm调优工具_JVM性能调优监控工具jps、jstack、jmap、jhat、hprof使用详解
来自:ITeye博客, 作者:Josh_Persistence 链接:https://www.iteye.com/blog/josh-persistence-2161848 现实企业级Java应用开发 ...
- Jvm 系列(七):Jvm 调优-工具篇
工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题 ...
- jvm系列(七):jvm调优-工具篇
16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...
- jvm调优工具_JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用
现实企业级Java应用开发.维护中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 ...
- jvm调优工具详解及调优实战
前置工作 首先本地启动一个java项目 欢迎关注个人公众号[好好学技术]交流学习 jps查看进程 dongfengfan@dongfengdeMacBook-Pro ~/Desktop> jps ...
- 【JVM调优工具篇】jvisualvm工具导出dump文件教程
1.首先启动程序(需确保程序一直在运行中) 2.打开JvisualVM工具 3.打开对应的程序进程 4.点击线程->线程dump 5.右键快照->另存为 6.结束
- 【JVM调优工具篇】使用JProfiler追踪GC Roots溯源
1.首先启动程序(让程序一直保持运行状态) 2.启动JProfiler 3.打开对应的进程 4.Live memory->All Objects 5.右键->Use Selected Ob ...
最新文章
- linux命令less
- 通过调用门进行控制转移 ——《x86汇编语言:从实模式到保护模式》读书笔记29
- 如何编写配置文件 JAVA_SpringBoot 如何编写配置文件
- php idwork,idwork.php
- iPad开发--QQ空间,处理横竖屏布局,实现子控件中的代理
- 时间戳 java_java中获取时间戳的方法
- OpenJudge NOI 1.8 17:最好的草
- 信息学奥赛C++语言:求各位数和2
- “七大属性加持,三个全新升级组件”这个高性能利器有点厉害
- GP学习(五)—ArcGIS Toolbox Reference dialog box
- 钉钉自带浏览器版本过低,导致Object.assign不兼容...
- Loopback、Null0接口揭秘
- 微软推荐您完成Windows 10 的免费升级
- leetcode刷题日记-leetcode刷题日记-71. 简化路径
- 手机资料误删恢复有什么办法
- android怎么改名字,手把手教你如何修改安卓软件的图标和名字
- 关于Release版除法反汇编的小结
- FFmpeg指令(./ffmpeg -h long)
- 鸡啄米:C++编程入门系列之三(VS2010的使用介绍)
- 【突变检验合集】含Pettitt突变检验等