JVM原理及调优

wKioL1WcBYmiSDmrAAEo--P5L6s372.jpg

wKioL1WcBYmQTn7FAAIw7GKCQB0978.jpg

wKiom1WcA7qADUngAAFqTQmu4Ak781.jpg

JVM基础知识大集合

===========================================================================================

1. JVM内存泄露的几种类型    

    持久代溢出(java.lang.OutOfMemoryError: PermGen space)

    对溢出(java.lang.OutOfMemoryError: java heap space)

     栈溢出(java.lang.StackOverflowError)


2. JVM参数配置的

    tomcat里的JVM参数配置在tomcat/bin/catalina.sh文件里的cygwin=false上边。


    JAVA_OPTS="-Xms128m -Xmx128m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=128m -Djava.rmi.server.hostname=192.168.70.128 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"


3. JVM性能监控命令

 【1】jmap命令---定位内存泄露

  常用参数:-heap   查看当前堆内存的使用情况

        -histo  快速定义内存泄露、

        -dump  把内存使用情况的情况输出到文件中


 用法: 1) jmap -head pid   查看当前堆内存的使用情况

       (pid为tomcat的pid,或者jdk的pid)

wKiom1WhFzKyXYr2AAJWrVDkt3k177.jpg

从图中可看出,年老代的内存已经使用完。此时报java.lang.OutOfMemoryError: Java heap space

 2)jmap -histo pid 快速定义内存泄露、

    wKioL1WdTMahExjdAAUVZ4DVV1s071.jpg 

首先,查看前30条记录中是否有自己项目中调用的方法。 如果有,初步可断定是该方法中有内存泄露。

如果前30条记录中没有自己项目中调用的方法,则可用jmap -dump:live,format=b,file=andashu 2292 把当前的堆内存使用情况输入到文件中 , 然后用jhat或Mat去分析内存泄露的原因。

[注意: jmap -dump后悔自动触发一次full GC]  

  【2】jprofiler工具---定位内存泄露、CPU热点问题

   1)jprofiler的安装

    windows安装客户端,linux安装服务器端。通过客户端访问服务器端。

    连接成功后,如图所示:

wKiom1WlPqOSOt0hAAULH_JQWlg551.jpg

  2)jprofile分析内存泄露的步骤 

    第一步:点击Instance count按内存使用情况排序。

    第二步:在使用内存最大的对象上右键选择Mark Current Values

    第三步:加压,查看图的变化

    第四步:点击右上角Run Gc ,此时相当于调用system.GC。 此时我们发现,所有内存都减少了,处了该对象的内存,由此可断定该对象有内存泄露发生。

    第五步:在该对象上右键选择Show Selection In Heap Walker,把该对象放到head内存中,可查看具体造成内存泄露的代码。

 3)jprofile分析CPU热点问题

   把jprofile工具切换到CPU视图,不断加压,我们发现现实如下

 wKioL1WlQ1mAgL-QAAOnwpRjkt4658.jpg

从图中红色区域,逐层下钻分析可得出具体时间是SQL语句的问题,还是方法的问题,还是其他问题。





你可能感兴趣的:(jvm)