常用的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调优工具的使用方法相关推荐

  1. jvm调优五:jvm调优工具和调优实战

    jvm调优工具和调优实战 jvm自带常用命令 JPS jps是用于查看有权访问的hotspot虚拟机的进程id. 当未指定hostid时,默认查看本机jvm进程id -l:输出完整jar名称 -v:输 ...

  2. jvm调优 java_opt_Java-100天知识进阶-JVM调优工具-JDK自带工具-知识铺《八》

    原标题:Java-100天知识进阶-JVM调优工具-JDK自带工具-知识铺<八> JVM 监控分析工具 一.JDK 自带工具 1. jconsole JDK/bin 目录下, jconso ...

  3. 【JVM调优工具】JVM调优工具

    一.JVM调优工具 1. jstat工具 jstat命令详解_zhaozheng7758的专栏-CSDN博客_jstat 干货:JVM 堆内存和非堆内存 - 茶轴的青春 - 博客园 [JVM]jsta ...

  4. jvm调优工具_JVM性能调优监控工具jps、jstack、jmap、jhat、hprof使用详解

    来自:ITeye博客, 作者:Josh_Persistence 链接:https://www.iteye.com/blog/josh-persistence-2161848 现实企业级Java应用开发 ...

  5. Jvm 系列(七):Jvm 调优-工具篇

    工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相关问题 ...

  6. jvm系列(七):jvm调优-工具篇

    16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗 ...

  7. jvm调优工具_JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用

    现实企业级Java应用开发.维护中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 ...

  8. jvm调优工具详解及调优实战

    前置工作 首先本地启动一个java项目 欢迎关注个人公众号[好好学技术]交流学习 jps查看进程 dongfengfan@dongfengdeMacBook-Pro ~/Desktop> jps ...

  9. 【JVM调优工具篇】jvisualvm工具导出dump文件教程

    1.首先启动程序(需确保程序一直在运行中) 2.打开JvisualVM工具 3.打开对应的程序进程 4.点击线程->线程dump 5.右键快照->另存为 6.结束

  10. 【JVM调优工具篇】使用JProfiler追踪GC Roots溯源

    1.首先启动程序(让程序一直保持运行状态) 2.启动JProfiler 3.打开对应的进程 4.Live memory->All Objects 5.右键->Use Selected Ob ...

最新文章

  1. linux命令less
  2. 通过调用门进行控制转移 ——《x86汇编语言:从实模式到保护模式》读书笔记29
  3. 如何编写配置文件 JAVA_SpringBoot 如何编写配置文件
  4. php idwork,idwork.php
  5. iPad开发--QQ空间,处理横竖屏布局,实现子控件中的代理
  6. 时间戳 java_java中获取时间戳的方法
  7. OpenJudge NOI 1.8 17:最好的草
  8. 信息学奥赛C++语言:求各位数和2
  9. “七大属性加持,三个全新升级组件”这个高性能利器有点厉害
  10. GP学习(五)—ArcGIS Toolbox Reference dialog box
  11. 钉钉自带浏览器版本过低,导致Object.assign不兼容...
  12. Loopback、Null0接口揭秘
  13. 微软推荐您完成Windows 10 的免费升级
  14. leetcode刷题日记-leetcode刷题日记-71. 简化路径
  15. 手机资料误删恢复有什么办法
  16. android怎么改名字,手把手教你如何修改安卓软件的图标和名字
  17. 关于Release版除法反汇编的小结
  18. FFmpeg指令(./ffmpeg -h long)
  19. 鸡啄米:C++编程入门系列之三(VS2010的使用介绍)
  20. 【突变检验合集】含Pettitt突变检验等

热门文章

  1. ios逆向工具theos tweak make编译错误集合
  2. 锆石科技开发板的简单介绍
  3. 将html导出为PDF文件(为PDF加盖章)
  4. linux开启nginx 443端口无效,http – Nginx正在侦听端口80或443但没有响应
  5. ERP实施中需掌握的基本财务基础知识
  6. OkHttp使用及工具类封装
  7. 系统封装教程---之几种常用封装工具和驱动包的简单介绍
  8. 格林公式求圆并的面积及重心
  9. mysql有没有开窗函数_mysql实现开窗函数
  10. codeforces #630 F. Selection of Personnel