`
youyu4
  • 浏览: 435438 次
社区版块
存档分类
最新评论

JVM之监控JVM

 
阅读更多

JVM之监控JVM

 

JVM常用的调忧工具

 

  • Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用。对垃圾回收算法有很详细的跟踪。
  • JProfiler:商业软件,需要付费。功能强大。
  • VisualVM:JDK自带,功能强大,与JProfiler类似。推荐。

 

 

监控工具主要分析下面内容

 

  • 堆监控
  • 线程监控
  • 热点分析
  • 生成快照及分析

 

 

堆监控

 

堆信息查看

 

  • 可查看堆空间大小分配(年轻代、年老代、持久代分配)
  • 提供即时的垃圾回收功能
  • 垃圾监控(长时间监控回收情况)

 

堆内类、对象信息查看

 

  • 类、对象的数量
  • 类、对象的类型



 

 

对象引用情况查看



 
 

有了堆信息查看方面的功能,我们一般可以顺利解决以下问题:

 

  • 年老代年轻代大小划分是否合理
  • 内存泄漏
  • 垃圾回收算法设置是否合理

 

 

线程监控 

 

  • 线程信息监控:系统线程数量
  • 线程状态监控:各个线程都处在什么样的状态下



 


Dump线程详细信息

 

  • 查看线程内部运行情况
  • 死锁检查



 

 

 

热点分析

 

  • CPU热点:检查系统哪些方法占用的大量CPU时间
  • 内存热点:检查哪些对象在系统中数量最大(一定时间内存活对象和销毁对象一起统计)

       这两个东西对于系统优化很有帮助。我们可以根据找到的热点,有针对性的进行系统的瓶颈查找和进行系统优化,而不是漫无目的的进行所有代码的优化。



 

 

 

快照

 

快照是系统运行到某一时刻的一个定格。在我们进行调优的时候,不可能用眼睛去跟踪所有系统变化,依赖快照功能,我们就可以进行系统两个不同运行时刻,对象(或类、线程等)的不同,以便快速找到问题。

 

举例说,我要检查系统进行垃圾回收以后,是否还有该收回的对象被遗漏下来的了。那么,我可以在进行垃圾回收前后,分别进行一次堆情况的快照,然后对比两次快照的对象情况。

 

生成快照的方法

 

  • 使用$JAVA_HOME/bin/jmap -dump来触发,eg:jmap -dump:format=b,file=/home/longhao/heamdump.out
  • 使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun.management>HotSpotDiagnostic>操作>dumpHeap中,点击 dumpHeap按钮。生成的dump文件在java应用的根目录下面。
  • 在应用启动时配置相关的参数 -XX:+HeapDumpOnOutOfMemoryError,当应用抛出OutOfMemoryError时生成dump文件。
  • 使用hprof。启动虚拟机加入-Xrunhprof:head=site,会生成java.hprof.txt文件。该配置会导致jvm运行非常的慢,不适合生产环境。

 

 

 

内存泄漏检查

 

内存泄漏是比较常见的问题,而且解决方法也比较通用,这里可以重点说一下,而线程、热点方面的问题则是具体问题具体分析了。

 

内存泄漏一般可以理解为系统资源(各方面的资源,堆、栈、线程等)在错误使用的情况下,导致使用完毕的资源无法回收(或没有回收),从而导致新的资源分配请求无法完成,引起系统错误。

 

 

主要的内存问题有:

 

  • 年老代堆空间被占满
  • 持久代被占满
  • 堆栈溢出
  • 线程堆栈满
  • 系统内存被占满

 

 

区别内存泄露和系统超负载

 

内存泄漏和系统超负荷两者是有区别的,虽然可能导致的最终结果是一样的。内存泄漏是用完的资源没有回收引起错误,而系统超负荷则是系统确实没有那么多资源可以分配了(其他的资源都在使用)。

 

注意:内存泄漏对系统危害比较大,因为他可以直接导致系统的崩溃。

 

 

 

年老代堆空间被占满

 

异常:java.lang.OutOfMemoryError: Java heap space

 

说明:每次垃圾回收后,堆被占用的空间都比上一次大,典型的例子是没有关闭数据库连接。


 

解决

 

这种方式解决起来也比较容易,一般就是根据垃圾回收前后情况对比,同时根据对象引用情况(常见的集合对象引用)分析,基本都可以找到泄漏点。

 

 

 

持久代被占满

 

异常:java.lang.OutOfMemoryError: PermGen space

 

说明

 

Perm空间被占满。无法为新的class分配存储空间而引发的异常。这个异常以前是没有的,但是在Java反射大量使用的今天这个异常比较常见了。主要原因就是大量动态反射生成的类不断被加载,最终导致Perm区被占满;还有个可能是JSP太多。

 

更可怕的是,不同的classLoader即便使用了相同的类,但是都会对其进行加载,相当于同一个东西,如果有N个classLoader那么他将会被加 载N次。因此,某些情况下,这个问题基本视为无解。当然,存在大量classLoader和大量反射类的情况其实也不多。

 

解决

  • -XX:MaxPermSize=16m
  • 换用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来减少分配给单个线程的空间,也可以增加系统总共内生产的线程数。

 

解决

  • 重新设计系统减少线程数量
  • 线程数量不能减少的情况下,通过-Xss减小单个线程大小。以便能生产更多的线程。

 

 

垃圾回收的悖论


       所谓“成也萧何败萧何”。Java的垃圾回收确实带来了很多好处,为开发带来了便利。但是在一些高性能、高并发的情况下,垃圾回收确成为了制约Java应 用的瓶颈。目前JDK的垃圾回收算法,始终无法解决垃圾回收时的暂停问题,因为这个暂停严重影响了程序的相应时间,造成拥塞或堆积。这也是后续JDK增加 G1算法的一个重要原因。

 

 

 

 

  • 大小: 16.8 KB
  • 大小: 30.1 KB
  • 大小: 53.6 KB
  • 大小: 37.3 KB
  • 大小: 48.4 KB
  • 大小: 23.1 KB
  • 大小: 22.4 KB
分享到:
评论

相关推荐

    Kubernetes集群之微服务JVM内存监控

    原文链接:https://blog.csdn.net/m0_37814112/article/details/119028528 说明:Kubernetes集群之微服务JVM内存监控,prometheus服务yaml文件

    jvm内存监控工具使用

    ### JVM内存监控工具详解 #### 引言 Java Virtual Machine (JVM) 是运行 Java 应用程序的核心组件,其性能直接影响应用的响应速度和稳定性。JVM 的内存管理是性能优化的关键,尤其是在高并发环境下,合理的内存...

    涨见识!JVM性能监控与调优实战 一线大厂大牛讲师的JVM优化案例与解决方案课程

    JVM性能监控与调优实战课程,作为整篇课程的重中之重,非常值得同学们参考学习。课程前端讲解了JVM的性能监控和调优的概述,对调优的的方法和工具进行讲解学习,让同学们掌握方法,理解知识。课程的中间阶段我们进行...

    visualvm监控jvm及远程jvm监控方法

    通过以上步骤,开发者可以利用VisualVM有效地管理和监控JVM,及时发现并解决性能问题,提高Java应用的稳定性和效率。无论是本地还是远程,VisualVM都是一个强大且易用的JVM工具,值得在日常开发和调优工作中使用。

    JVM TI监控JAVA执行过程

    本文将深入探讨JVM TI的核心概念、主要功能以及如何使用它来监控Java执行过程。 一、JVM TI概述 JVM TI是Java虚拟机的一部分,它是JDK中的一个本地接口,提供了C/C++的头文件和库,使得开发人员可以通过编写本地...

    JVM状态监控与OOM案例分析

    JVM状态监控与OOM案例分析…… 简单认识,了解

    idea 插件visulgc 监控jvm

    idea 插件visulgc 监控jvm

    vmmap 观察jvm内存 监控jvm jvm线程

    本文将详细讲解如何利用`vmmap`监控JVM,理解其核心概念,以及分析JVM线程。 首先,`vmmap`是Apple提供的命令行工具,用于显示进程的虚拟内存映射。通过这个工具,我们可以查看JVM进程中的堆、栈、元空间、代码缓存...

    jvm内存监控及调优方法

    jvm内存监控及调优方法,详细讲解jvm的原理以及常用调优手段

    JVM监控实例数 windows监控 线程测试 单例模式下测试JVM实例是否一个

    本文将探讨如何在Windows环境下通过简单的命令行工具来监控JVM实例的数量,以及如何进行线程测试,特别是在单例模式下的JVM实例验证。 首先,了解如何监控JVM实例数量。在Windows操作系统中,我们可以使用`jps`命令...

    垃圾回收器与JVM性能监控工具介绍以及java多线程安全性介绍ppt

    垃圾回收器与JVM性能监控工具介绍垃圾回收器与JVM性能监控工具介绍ppt。

    jvm监控工具介绍

    jstatd是JVM监控服务,它基于RMI(Remote Method Invocation)技术,允许远程机器获取本地JVM应用的信息。默认监听1099端口。在启用jstatd时,可能需要配置安全策略文件(如`jstatd.all.policy`),赋予必要的权限...

    JVM下篇:性能监控与调优篇.7z

    通过对以上知识点的掌握,开发者能够有效地监控JVM的运行状态,及时发现和解决问题,从而提升Java应用的性能和稳定性。在实际工作中,应结合具体应用和硬件环境,不断实践和优化,以达到最佳的JVM运行效果。

    JVM监控工具使用入门

    ### JVM监控工具使用入门 #### 引言 Java虚拟机(JVM)是运行Java程序的基础环境,其性能直接影响到应用程序的稳定性和响应速度。为了更好地理解和优化JVM的运行状态,开发人员需要掌握一系列的监控工具和技术。...

    JVM 监控 调优 工具

    **JVM监控工具** 1. **JConsole**:这是Java SDK自带的一个图形化监控工具,可以查看JVM的内存使用情况、线程状态、类加载情况等。 2. **VisualVM**:功能更为强大的多合一JVM分析工具,提供CPU和内存分析、线程...

    zabbix监控JAVA 进程 JVM数据统计分析告警监控

    zabbix自动发现JAVA进程,并进行自动添加监控JAVA 进程的JVM数据,统计分析告警监控。 支持多种中间件,tomcat、weblogic、微服务方式部署JAVA应用监控。 自带发现脚本和监控脚本,以及zabbix导入模板。

    hpjmeter jvm gc监控工具

    【标签】"hpjmeter jvm监控"指示了该工具的主要功能,即对JVM进行实时监控,包括查看内存使用情况、线程状态、类加载信息等。"jvm gc"是Java虚拟机的垃圾收集器,负责自动回收不再使用的内存,以防止内存泄漏。"full...

    jvisualvm来JVM监控

    《使用jvisualvm进行JVM监控与调优详解》 在Java开发中,JVM(Java Virtual Machine)的性能监控和调优是至关重要的环节,它直接影响到应用程序的运行效率和稳定性。jvisualvm,作为Oracle JDK自带的一款强大的性能...

    监测JVM各项性能指标

    1. **JVM监控工具** - **jconsole**:Java可视化监控工具,可以显示JVM的内存、线程、类装载、Garbage Collection (GC) 和CPU使用情况等信息。 - **jvisualvm**:这是一个更加强大的多合一工具,包含jconsole的...

    精通Java监控:JVM监控工具的使用与实践

    本文将详细介绍如何在Java中使用JVM监控工具,包括监控工具的选择、基本使用方法、数据分析技巧和实际应用案例。 JVM监控工具是Java开发者的重要伙伴,它们提供了对Java应用程序内部运行机制的洞察。通过本文的详细...

Global site tag (gtag.js) - Google Analytics