您的位置:

诊断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内容就会被打印出来,这样就可以根据打印出的结果进行判断了