本文目录一览:
- 1、java内存诊断软件?
- 2、如何诊断 Java 中的内存泄露
- 3、昭通java培训学校告诉你java内存诊断软件?
- 4、北大青鸟java培训:java内存诊断软件?
- 5、如何诊断 Java 中的内存泄露 – 码农网
- 6、怎样使用jstack诊断Java应用程序故障
java内存诊断软件?
对于每一个java进程来说都有自己的内存池和使用空间,而这也就意味着会出现内存使用错误等问题,而这时候我们就需要对java内存进行诊断分析,今天云南java培训就一起来了就一下,在进行内存诊断上都有哪些软件可以使用。
Java堆:分析诊断数据
堆转储分析
堆转储可以使用如下的工具进行分析:
EclipseMAT(内存分析工具,MemoryAnalyzerTool)是一个社区开发的分析堆转储的工具。它提供了一些很棒的特性,包括:
可疑的泄漏点:它能探测堆转储中可疑的泄露点,报告持续占有大量内存的对象;
直方图:列出每个类的对象数量、浅大小(shallow)以及这些对象所持有的堆。直方图中的对象可以很容易地使用正则表达式进行排序和过滤。这样有助于放大并集中我们怀疑存在泄露的对象。它还能够对比两个堆转储的直方图,展示每个类在实例数量方面的差异。这样能够帮助我们查找Java堆中增长快的对象,并进一步探查确定在堆中持有这些对象的根;
不可达的对象:MAT有一个非常棒的功能,那就是它允许在它的工作集对象中包含或排除不可达/死对象。如果你不想查看不可达的对象,也就是那些会在下一次GC周期中收集掉的对象,只关心可达的对象,那么这个特性是非常便利的;
重复的类:展现由多个类加载器所加载的重复的类;
到GC根的路径:能够展示到GC根(JVM本身保持存活的对象)的引用链,这些GC根负责持有堆中的对象;
OQL:我们可以使用对象查询语言(ObjectQueryLanguage)来探查堆转储中的对象。它丰富了OQL的基础设施,能够编写复杂的查询,帮助我们深入了解转储的内部。
JavaVisualVM:监控、分析和排查Java语言的一站式工具。它可以作为JDK工具的一部分来使用,也可以从GitHub上下载。它所提供的特性之一就是堆转储分析。它能够为正在监控的应用创建堆转储,也可以加载和解析它们。从堆转储中,它可以展现类的直方图、类的实例,也能查找特定实例的GC根;
jhat命令工具(在/bin文件夹中)提供了堆转储分析的功能,它能够在任意的浏览器中展现堆转储中的对象。默认情况下,Web服务器会在7000端口启动。jhat支持范围广泛的预定义查询和对象查询语言,以便于探查堆转储中的对象;
Java任务控制(JavaMissionControl)的JOverflow插件:这是一个实验性的插件,能够让Java任务控制执行简单的堆转储分析并报告哪里可能存在内存浪费;
Yourkit是一个商业的Javaprofiler,它有一个堆转储分析器,具备其他工具所提供的几乎所有特性。除此之外,YourKit还提供了:
可达性的范围(reachabilityscope):它不仅能够列出可达和不可达的对象,还能按照它们的可达性范围显示它们的分布,也就是,强可达、弱/软可达或不可达;
内存探查:YourKit内置了一组全面的查询,而不是使用ad-hoc查询功能,YourKit的查询能够探查内存,查找反模式并为常见的内存问题分析产生原因和提供解决方案。
如何诊断 Java 中的内存泄露
先用下面的命令监视进程:
while ( sleep 1 ) ; do ps -p $PID -o %cpu,%mem,rss ; done
如果看到内存上升很快,可能是因为虚拟机设置。如果没有明确指定JVM的内存设置,它将设置默认值给他们。要获得默认值,使用以下命令:
java -XX:+PrintFlagsFinal -version | grep -i HeapSize
如果这些都不符合希望的,那么就需要指定JVM的内存设置。可以用下面的命令设置最小和最大堆大小:
java -Xms128m -Xmx256m
尽管有了合理的内存设置,也可以监控进程,但你仍然可能看到内存随时间增加。为了进一步探究原因,可以使用下面的命令查看对象实例的直方图:
jmap -histo $PID
如果仍然没有足够的信息,那么可以用以下命令进行堆转储:
jmap -dump:format=b,file=/tmp/dump1.hprof $PID
通常,会用两个堆转储,然后使用下面的jhat命令比较它们:
jhat -baseline /tmp/dump1.hprof /tmp/dump2.hprof
这个命令会启动一个HTTP服务器,可以用它来探索这两个堆转储之间的差值。在默认情况下,HTTP服务器启动7000端口,可以在浏览器中访问该端口。
如果有防火墙,可以通过SSH访问,那么可以通过如下命令连接该端口:
ssh -L 7000:localhost:7000 $HOST
昭通java培训学校告诉你java内存诊断软件?
对于每一个java进程来说都有自己的内存池和使用空间,而这也就意味着会出现内存使用错误等问题,而这时候我们就需要对java内存进行诊断分析,今天昭通java培训就一起来了就一下,在进行内存诊断上都有哪些软件可以使用。
Java堆:分析诊断数据
堆转储分析
堆转储可以使用如下的工具进行分析:
EclipseMAT(内存分析工具,MemoryAnalyzerTool)是一个社区开发的分析堆转储的工具。它提供了一些很棒的特性,包括:
可疑的泄漏点:它能探测堆转储中可疑的泄露点,报告持续占有大量内存的对象;
直方图:列出每个类的对象数量、浅大小(shallow)以及这些对象所持有的堆。直方图中的对象可以很容易地使用正则表达式进行排序和过滤。这样有助于放大并集中我们怀疑存在泄露的对象。它还能够对比两个堆转储的直方图,展示每个类在实例数量方面的差异。这样能够帮助我们查找Java堆中增长快的对象,并进一步探查确定在堆中持有这些对象的根;
不可达的对象:MAT有一个非常棒的功能,那就是它允许在它的工作集对象中包含或排除不可达/死对象。如果你不想查看不可达的对象,也就是那些会在下一次GC周期中收集掉的对象,只关心可达的对象,那么这个特性是非常便利的;
重复的类:展现由多个类加载器所加载的重复的类;
到GC根的路径:能够展示到GC根(JVM本身保持存活的对象)的引用链,这些GC根负责持有堆中的对象;
OQL:我们可以使用对象查询语言(ObjectQueryLanguage)来探查堆转储中的对象。它丰富了OQL的基础设施,能够编写复杂的查询,帮助我们深入了解转储的内部。
JavaVisualVM:监控、分析和排查Java语言的一站式工具。它可以作为JDK工具的一部分来使用,也可以从GitHub上下载。它所提供的特性之一就是堆转储分析。它能够为正在监控的应用创建堆转储,也可以加载和解析它们。从堆转储中,它可以展现类的直方图、类的实例,也能查找特定实例的GC根;
jhat命令工具(在/bin文件夹中)提供了堆转储分析的功能,它能够在任意的浏览器中展现堆转储中的对象。默认情况下,Web服务器会在7000端口启动。jhat支持范围广泛的预定义查询和对象查询语言,以便于探查堆转储中的对象;
Java任务控制(JavaMissionControl)的JOverflow插件:这是一个实验性的插件,能够让Java任务控制执行简单的堆转储分析并报告哪里可能存在内存浪费;
Yourkit是一个商业的Javaprofiler,它有一个堆转储分析器,具备其他工具所提供的几乎所有特性。除此之外,YourKit还提供了:
可达性的范围(reachabilityscope):它不仅能够列出可达和不可达的对象,还能按照它们的可达性范围显示它们的分布,也就是,强可达、弱/软可达或不可达;
内存探查:YourKit内置了一组全面的查询,而不是使用ad-hoc查询功能,YourKit的查询能够探查内存,查找反模式并为常见的内存问题分析产生原因和提供解决方案。
北大青鸟java培训:java内存诊断软件?
对于每一个java进程来说都有自己的内存池和使用空间,而这也就意味着会出现内存使用错误等问题,而这时候我们就需要对java内存进行诊断分析,今天甘肃java培训就一起来了就一下,在进行内存诊断上都有哪些软件可以使用。
Java堆:分析诊断数据堆转储分析堆转储可以使用如下的工具进行分析:EclipseMAT(内存分析工具,MemoryAnalyzerTool)是一个社区开发的分析堆转储的工具。
它提供了一些很棒的特性,包括:可疑的泄漏点:它能探测堆转储中可疑的泄露点,报告持续占有大量内存的对象;直方图:列出每个类的对象数量、浅大小(shallow)以及这些对象所持有的堆。
直方图中的对象可以很容易地使用正则表达式进行排序和过滤。
这样有助于放大并集中我们怀疑存在泄露的对象。
它还能够对比两个堆转储的直方图,展示每个类在实例数量方面的差异。
这样能够帮助我们查找Java堆中增长快的对象,并进一步探查确定在堆中持有这些对象的根;不可达的对象:MAT有一个非常棒的功能,那就是它允许在它的工作集对象中包含或排除不可达/死对象。
如果你不想查看不可达的对象,也就是那些会在下一次GC周期中收集掉的对象,只关心可达的对象,那么这个特性是非常便利的;重复的类:展现由多个类加载器所加载的重复的类;到GC根的路径:能够展示到GC根(JVM本身保持存活的对象)的引用链,这些GC根负责持有堆中的对象;OQL:我们可以使用对象查询语言(ObjectQueryLanguage)来探查堆转储中的对象。
它丰富了OQL的基础设施,能够编写复杂的查询,帮助我们深入了解转储的内部。
JavaVisualVM:监控、分析和排查Java语言的一站式工具。
它可以作为JDK工具的一部分来使用,也可以从GitHub上下载。
它所提供的特性之一就是堆转储分析。
它能够为正在监控的应用创建堆转储,也可以加载和解析它们。
从堆转储中,它可以展现类的直方图、类的实例,也能查找特定实例的GC根;jhat命令工具(在/bin文件夹中)提供了堆转储分析的功能,它能够在任意的浏览器中展现堆转储中的对象。
默认情况下,Web服务器会在7000端口启动。
jhat支持范围广泛的预定义查询和对象查询语言,以便于探查堆转储中的对象;Java任务控制(JavaMissionControl)的JOverflow插件:这是一个实验性的插件,能够让Java任务控制执行简单的堆转储分析并报告哪里可能存在内存浪费;Yourkit是一个商业的Javaprofiler,它有一个堆转储分析器,具备其他工具所提供的几乎所有特性。
除此之外,YourKit还提供了:可达性的范围(reachabilityscope):它不仅能够列出可达和不可达的对象,还能按照它们的可达性范围显示它们的分布,也就是,强可达、弱/软可达或不可达;内存探查:YourKit内置了一组全面的查询,而不是使用ad-hoc查询功能,YourKit的查询能够探查内存,查找反模式并为常见的内存问题分析产生原因和提供解决方案。
如何诊断 Java 中的内存泄露 – 码农网
先用下面的命令监视进程:
while ( sleep 1 ) ; do ps -p $PID -o %cpu,%mem,rss ; done
如果看到内存上升很快,可能是因为虚拟机设置。如果没有明确指定JVM的内存设置,它将设置默认值给他们。要获得默认值,使用以下命令:
java -XX:+PrintFlagsFinal -version | grep -i HeapSize
如果这些都不符合希望的,那么就需要指定JVM的内存设置。可以用下面的命令设置最小和最大堆大小:
java -Xms128m -Xmx256m
尽管有了合理的内存设置,也可以监控进程,但你仍然可能看到内存随时间增加。为了进一步探究原因,可以使用下面的命令查看对象实例的直方图:
jmap -histo $PID
如果仍然没有足够的信息,那么可以用以下命令进行堆转储:
jmap -dump:format=b,file=/tmp/dump1.hprof $PID
通常,会用两个堆转储,然后使用下面的jhat命令比较它们:
jhat -baseline /tmp/dump1.hprof /tmp/dump2.hprof
这个命令会启动一个HTTP服务器,可以用它来探索这两个堆转储之间的差值。在默认情况下,HTTP服务器启动7000端口,可以在浏览器中访问该端口。
如果有防火墙,可以通过SSH访问,那么可以通过如下命令连接该端口:
ssh -L 7000:localhost:7000 $HOST
怎样使用jstack诊断Java应用程序故障
如:
jstack [-l] pid
提供一个测试的例子:
/**
* 死锁例子
* @author crane.ding
* @since 2011-3-20
*/
public class DeadLock {
public static void main(String[] args) {
final Object obj_1 = new Object(), obj_2 = new Object();
Thread t1 = new Thread("t1"){
@Override
public void run() {
synchronized (obj_1) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
synchronized (obj_2) {
System.out.println("thread t1 done.");
}
}
}
};
Thread t2 = new Thread("t2"){
@Override
public void run() {
synchronized (obj_2) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
synchronized (obj_1) {
System.out.println("thread t2 done.");
}
}
}
};
t1.start();
t2.start();
}
}
保存为DeadLock.java。以上DeadLock类是一个死锁的例子,假使在咱们不知情的情况下,运行DeadLock后,发现等了N久都没有在屏幕打印线程完成信息。这个时候咱们就可以使用ps –ef|grep xxx查看该程序的pid值和使用jstack来生产堆栈结果问题。
javac DeadLock.java
jar cvf deadlock.jar DeadLock*.class
java -cp deadlock.jar DeadLock
ps –ef|grep deadlock.jar #获取deadlock.jar进程的pid为1448
jstack -l 1448 deadlock.jstack
结果文件deadlock.jstack内容就会被打印出来,这样就可以根据打印出的结果进行判断了