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=16m

  2. 换用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减小单个线程大小。以便能生产更多的线程。

转载于:https://www.cnblogs.com/jxhd1/p/6547635.html

JVM调优总结(7):调优方法相关推荐

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

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

  2. JVM内存模型和性能调优:系列文章 - 导读

    0.JVM课程总体介绍 学习 Java 虚拟机能深入地理解 Java 这门语言,想要深入学习java的各种细节,很多时候你要深入到字节码层次去分析,你才能得到准确的结论,通过学习JVM你了解JVM历史 ...

  3. java虚拟机工作原理图_超“强”的图文详解-JVM虚拟机底层原理与调优实战

    今天我和大家分享一篇文章,文章上半部分为JVM底层原理 下半部分为调优实战 文章有点长,需要点耐心哦! 如果觉得看文章太难理解,就点击下面我投稿B站的jvm视频讲解. 还配有视频讲解:解密BATJ一线 ...

  4. JVM之堆Heap参数调优入门

    JVM之堆Heap参数调优入门 目录: JVM体系结构概览 JVM之堆Heap参数调优入门 2.1 java7和 java8堆结构图 2.2 堆内存调优简介 1. JVM体系结构概览 2. JVM之堆 ...

  5. 【Spark篇】---Spark调优之代码调优,数据本地化调优,内存调优,SparkShuffle调优,Executor的堆外内存调优...

    一.前述 Spark中调优大致分为以下几种 ,代码调优,数据本地化,内存调优,SparkShuffle调优,调节Executor的堆外内存. 二.具体    1.代码调优 1.避免创建重复的RDD,尽 ...

  6. 大数据技术之_19_Spark学习_07_Spark 性能调优 + 数据倾斜调优 + 运行资源调优 + 程序开发调优 + Shuffle 调优 + GC 调优 + Spark 企业应用案例

    大数据技术之_19_Spark学习_07 第1章 Spark 性能优化 1.1 调优基本原则 1.1.1 基本概念和原则 1.1.2 性能监控方式 1.1.3 调优要点 1.2 数据倾斜优化 1.2. ...

  7. hbase 读写调优_hbase性能调优

    一.服务端调优 1.参数配置 1).hbase.regionserver.handler.count:该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB ...

  8. Spark性能调优-RDD算子调优篇

    Spark性能调优-RDD算子调优篇 RDD算子调优 1. RDD复用 在对RDD进行算子时,要避免相同的算子和计算逻辑之下对RDD进行重复的计算,如下图所示: 对上图中的RDD计算架构进行修改,得到 ...

  9. 十八般武艺玩转GaussDB(DWS)性能调优:总体调优策略

    摘要: 性能调优是应用迁移或开发过程中的关键步骤,同时也在整个项目实施过程中占据很大的份量,本篇主要介绍数据库级别的性能调优思路和总体策略. 性能调优是应用迁移或开发过程中的关键步骤,同时也在整个项目 ...

  10. R语言使用caret包对GBM模型参数调优(自定义调优的评估指标,例如ROC指标):抽取预测标签及类概率、抽样ROC的指标并绘制密度图

    R语言使用caret包对GBM模型参数调优(自定义调优的评估指标,例如ROC指标):抽取预测标签及类概率.抽样ROC的指标并绘制密度图 目录 R语言使用caret包对GBM模型参数调优(自定义调优的评 ...

最新文章

  1. 2017《面向对象程序设计》寒假作业一
  2. PHP开发移动端接口
  3. python利器的使用-Python数据科学利器
  4. KVM更改虚拟机默认存储路径
  5. 再读新疆系列(六)——吹拂“卡拉库里湖”的风
  6. 我写的博客居然是百度搜索第一名 - 感谢国家 …
  7. 100亿估值的文和友,为何难以“走出”长沙?
  8. 8 一点就消失_农村即将消失的15个“老物件”,件件充满回忆,全认识说明你老了...
  9. java keydown_键盘事件keydown、keypress、keyup随笔整理总结
  10. gephi java教程_为Gephi准备数据
  11. Maven子父工程依赖配置,小白也能看得懂
  12. alter table添加表约束
  13. RAB, RB, SRB
  14. 互联网快讯:微信上线“仅传输文件”新功能;极米RS Pro 2获用户肯定;网宿科技与奇安信达成战略合作
  15. 三子棋超详细思路及步骤
  16. 12月更新!EasyOps全平台产品能力再升级,新增22+功能亮点解读~
  17. 解决QT加载dll失败问题
  18. 服务器usb驱动安装系统安装失败怎么办,win7系统安装USB3.0驱动程序失败的解决方法...
  19. 【每日早报】2019/09/30
  20. 关于apk加壳之动态加载dex文件

热门文章

  1. maven配置默认jdk版本
  2. 在可编辑div中插入文字或图片的问题解决思路
  3. Android开发实战三之导入现有Android工程项目
  4. Matlab中寻找二值图像最大联通域的算法
  5. bootloader烧写
  6. Nginx之https配置
  7. 深入理解HTML协议
  8. 2019Java常见面试下
  9. php5.4.16执行shell脚本
  10. 网络配置命令优先级和元字符