JVM(一)
JVM概念
一张图了解JDK、JRE、JVM的关系:
JDK (Java Development Kit)
JRE (Java Runtime Environment)
JVM (Java Virtual Machine)
JVM监控
JVM连接(监控)工具:
JConsole: JDK自带,功能简单,但是可以在系统有一定负 荷的情况下使用。对垃圾回收算法有很详细的跟踪。
JProfiler: 商业软件,需要付费。功能强大。
VisualVM: JDK自带,功能强大,与JProfiler类似,推荐。
VisualVM可以做的:
监控应用程序的性能和内存占用情况;
监控应用程序的线程、进行线程转储(Thread Dump)或堆转储(Heap Dump);
跟踪内存泄漏、监控垃圾回收器;
执行内存和CPU分析,保存快照以便脱机分析应用程序;
同时它还支持在MBeans上进行浏览和操作;
尽管 VisualVM自身要在JDK6版本以上运行,但是JDK1.4以上版本的程序都能被它监控。
如何连接JVM:
配置服务器端Java参数
启动服务器Java程序
打开jvisualvm.exe程序连接
示例环境:
1. 配置服务器端Java参数:
修改tomcat目录下的 bin\startup.sh 文件,在 最后一行exec "$PRGDIR"/"$EXECUTABLE" start "$@"之上添加如下代码:
export CATALINA_OPTS="$CATALINA_OPTS-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.56.2 -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=false ent.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access”
JVM调优
关于 JavaCore 和 HeapDump 文件
获取 JavaCore 和 HeapDump 文件
分析 JavaCore 和 HeapDump 文件
通过设置JVM参数进行调优
1. 关于 JavaCore 和 HeapDump 文件:
产生时间:
Java程序运行时,有时会产生JavaCore及HeapDump文件,它一般发生于Java程序遇到致命问题的情况下;
有时候致命问题发生后,Java应用不会死掉,还能继续运行;
为了能够保留Java应用发生致命错误前的运行状态,JVM在死掉前产生两个文件,分别为JavaCore及HeapDump文件;
Javacore,也可以称为threaddump或是javadump.
1. 关于 JavaCore 和 HeapDump 文件:
有何区别:
JavaCore是关于CPU的,而HeapDump文件是关于内存的。
JavaCore文件主要保存的是Java应用各线程在某一时刻的运行的位置它是一个文本文件,打开后可以看到每一个线程的执行栈,以stack trace的显示。通过对JavaCore文件的分析可以得到应用是否“卡”在某一点上,即某一点运行的时间太长,例如数据库查询,长期得不到响应,最终导致系统崩溃等情况。
HeapDump文件是一个二进制文件,它保存了某一时刻JVM堆中对象使用情况(指定时刻Java堆栈的快照,是一种镜像文件),这种文件需要相应的工具进行分析,如IBM Heap Analyzer 这类工具。这类文件最重要的作用就是分析系统中是否存在内存溢出的情况
3. 分析 JavaCore 和 HeapDump 文件:
JavaCore文件
通过两组文件在分析JavaCore时特别有效,因为它可以看出在先后两个时间点上,线程执行的位置,如果发现先后两组中同一线程都执行在同一位置,则说明此处可能有问题。
JavaCore文件的头部有一个“Current Thread Details”标记,它记录了JavaCore产生时系统运行的线程id,使用线程id在文件中查找线程的详细信息,该信息中记载了线程运行哪个类的时候造成的JavaCore。
3. 分析 JavaCore 和 HeapDump 文件:
HeapDump文件
HeapDump文件是指定时刻的Java堆栈的快照,是一种镜像文件。Heap Analyzer工具通过分析HeapDump文件,哪些对象占用了太多的堆栈空间,来发现导致内存泄漏或者可能引起内存泄漏的对象
4. 通过设置JVM参数进行调优:
JVM调优过程关于代的大小设置至关重要;
JVM中最大堆大小有3方面限制:操作系统数据类型(32bit or 64bit),系统可用虚拟内存,系统可用感物理内存。
(例如Win Server 2003,3.5GB物理内存,JDK5.0下测试,最大可设置1478MB)
如果应用动态调用一些类,如Hibernate,这种时候需要设置一个比较大的持久代空间来存放这些运行中新增的类,通过java –XX:MaxPermSize=<N>进行设置。