JProfiler简介
JProfiler 是一个商业的主要用于检查和跟踪系统(限于Java开发的)的性能的工具。JProfiler可以通过时时的监控系统的内存使用情况,随时监视垃圾回收,线程运行状况等手段,从而很好的监视JVM运行情况及其性能。
JProfiler 是一个全功能的Java剖析工具(profiler),专用于分析J2SE和J2EE应用程序。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。 JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。它让你得以对heap walker作资源回收器的root analysis,可以轻易找出内存漏失;heap快照(snapshot)模式让未被参照(reference)的对象、稍微被参照的对象、或在终结(finalization)队列的对象都会被移除;整合精灵以便剖析浏览器的Java外挂功能。
下载地址ej-technologies - Java APM, Java Profiler, Java Installer Builder
如果是在开发的过程中联调的话,可以在编辑器比如Ecplise或者IDEA安装JProfiler插件。
模拟OOM
这里为了简易实现OOM,在IDEA的jvm里面配置了当前程序运行的JVM参数
配置初始的堆大小为10m,最大的堆大小为20m
-Xms10m -Xmx20m
在配置了-XX:+PrintGCDetails,从哪打印的日志可以看出,堆内存的配置已经生效。
初始内存:9961472字节 ,9728.0K 9.5M
最大内存:18874368字节 ,18432.0K 18.0M
模拟OOM简单代码
byte[] array = new byte[1*1024*1024];
public static void main(String[] args){
ArrayList<Test> list = new ArrayList<Test>();
int count = 0;
try{
while(true){
list.add(new Test());
count++;
}
}catch (Error e){
System.out.println(count);
e.printStackTrace();
}
}
直接点击运行后,会报如下错误:
java.lang.OutOfMemoryError: Java heap space
at Test.<init>(Test.java:26)
at Test.main(Test.java:33)
对于简单的程序,日志较少的,可以直接在控制台日志定位到代码的位置,对于复杂的程序可以借助JProfiler来分析。
开发环境中可在idea中添加vm参数-XX:+HeapDumpOnOutOfMemoryError,将发生有OOM异常时的文件dump下来,一般是.hprof后缀的文件,用JProfiler打开即可查看产生异常的原因。