javajava 内存溢出出检测工具 哪个好

如何检查和解决java虚拟机内存溢出的问题_百度知道<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&使用visualvm远程监控JVM&&
前段时间在排查问题过程中我使用了jprofiler远程进行了jvm资源使用情况的监控,从系统的损耗来看,jprofiler对系统资源尤其是内存的消耗是非常庞大的。当时配置的jprofiler内存使用上线是1G,后来发现系统内存在整个测试过程中出现持续上涨的趋势,最后稳定在3G左右(JVM的内存我们配的上限&#20540;是2G)。
从这个情况来看,如果我们要在测试过程中利用图形界面的形式实时监控jvm内存的使用情况,使用jprofiler是不合适的;在对几个性能测试工具进行评估后,我们最终选定了visualvm进行我们的java资源监控,下面我将讲述一下如何配置visualvm监控jvm资源以及在监控过程中visualvm在server上面的性能消耗情况
1.&如何配置visualvm监控
visualvm支持在linux和windows上启用图形界面监控jvm的资源,基于目前我们的server资源比较紧张,而且从监控方便的角度来分析(我们现有server的linux系统是关闭图形界面的,如果要支持visualvm的图形显示需要安装插件),我推荐在自己的windows环境中安装监控的客户端
Visualvm目前支持两种remote
connection方式,分别是jstatd和JMX方式;我看了一下官方的说明文档,如果是针对jboss的监控,官方还是推荐使用JMX的方式监控,因此下面我就讲述一下如何在server端以及客户端配置JMX方式监控的visualvm:
(1)首先要修改JDK中JMX服务的配置文件,以获得相应的权限:
进入$JAVA_HOME所在的根目录的/jre/lib/management子目录下,
a.&将jmxremote.password.template文件复制为jmxremote.password
b.&调整jmxremote.access和jmxremote.password的权限为只读写,可以使用如下命令
chmod 600 jmxremote.access jmxremote.password
c.&打开jmxremote.password文件,去掉
# monitorRole&QED
# controlRole&R&D
这两行前面的注释符号
(2)修改env.sh
打开env.sh文件,并在JVM的启动配置中添加如下信息:
JAVA_OPTS=&-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
-Djava.rmi.server.hostname=10.20.150.218&&其他配置”
这几个配置的说明如下:
-Dcom.sun.management.jmxremote.port:这个是配置远程connection的端口号的,要确定这个端口没有被占用
-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false:这两个是固定配置,是JMX的远程服务权限的
-Djava.rmi.server.hostname:这个是配置server的IP的,要使用server的IP最好在机器上先用hostname
–i看一下IP是不是机器本身的IP,如果是127.0.0.1的话要改一下,否则远程的时候连不上,目前我们的server上我已经都改好了
(3)Windows客户端配置
JDK 1.6版本自带visualvm,只需要进到bin目录下启动即可
启动后页面比较简洁,配置也很简单:
a.&点击左侧菜单的add
Remote host,输入server的IP,然后再advanced
settings里配置端口(注意这个端口要和server上的端口一致)
b.&右击刚才配置的IP,选择JMX
connection方式,再次输入端口,就可以监视到JVM资源了,如下:
2. visualvm监控的资源消耗
我们配置了一个简单的apache&#43;jboss应用,并用jmeter进行了一个长时间的加压,在加压过程中重点关注了系统资源的使用情况,如下(加压到9:30结束,另外cpu在最后一段出现了较大的毛刺是由于我在加压最后在server上用脚本处理数据导致,可以忽略该部分):
从长时间加压的结果来看,visualvm在监控过程中对cpu和load不会造成什么压力,这点同jprofiler一致;内存在加压过程中总计有1%左右的升高(稳定后)(系统内存是8G),表明visualvm对系统内存的消耗比jprofiler要低很多,在正常性能测试过程中如果开启visualvm监控对系统整体性能基本上没有影响(不要进行dump
heap的操作);当然,visualvm有一些功能相对jprofiler要简化一些,因此如果需要排查性能问题我还是推荐使用jprofiler
使用JDK 1.6自带的jvisualvm监控远程服务器中Java程序资源占用情况
因为做实验的需要,最近把实验室的Web数据抽取程序修改为多线程版本并在服务器上做大量的数据抽取工作,服务器是Ubuntu Server 10.01版本,通过Putty连接监控程序的运行情况非常不直观,需要使用一个Java资源监控程序实现对目标程序的实时监控。Jdk1.5版本提供的监控工具是Jconsole,相信很多早期的Java开发人员都使用过这个程序,但Jconsole的界面实在是有点对不起观众,所以在jdk1.6中Oracle提供了一个新的可视化的JVM监控工具Java
VisualVM(官方介绍链接:),在Windows系统下的Java
VisualVM启动路径是$java_home$/jdk1.6.0/bin/jvisualvm.exe。
&&&&&&双击启动Java VisualVM后可以看到窗口左侧“应用程序”栏中有“本地”、“远程”、“快照”三个项目。其中“本地”下显示的是在localhost运行的Java程序的资源占用情况,如果本地有Java程序在运行的话启动Java
VisualVM即可看到相应的程序名,点击程序名打开相应的资源监控菜单,以图形的形式列出程序所占用的CPU、Heap、PermGen、类、线程的统计信息。“远程”项下列出的远程主机上的Java程序的资源占用情况,但需要在远程主机上运行jstatd守护程序,下面就以实现对远程Ubuntu Server中运行的Java程序资源监控为例说明如何使用Java VisualVM监控远程Java程序。
&&&&&&(1)在服务器上安装jstatd组件。由于安装JDK时配置选项的原因,有的服务器中没有默认安装jstatd组件。jstatd是openjdk中的一个package,使用apt-get命令安装openjdk即可。关于jstatd组件的详细介绍可参考:
sudo apt-get install openjdk-6-jdk
&&&&&&(2)在服务器上配置jstatd的security policy文件。jstatd是一个监控JVM从创建到销毁过程中资源占用情况并提供远程监控接口的RMI(Remote Method Invocation,远程方法调用)服务器程序,它是一个Daemon程序,要保证远程监控软件连接到本地的话需要jstatd始终保持运行。jstatd运行需要通过-J-Djava.security.policy=***指定安全策略,因此我们需要在服务器上建立一个指定安全策略的文件jstatd.all.policy,文件内容如下:
grant codebase &file:${java.home}/../lib/tools.jar& {
permission java.security.AllP
&&&&&&(3)修改服务器hosts文件中的IP地址。要使Java VisualVM成功连接到远程服务器上,服务器端应该在/etc/hosts文件中把本机地址设为本机的IP地址。使用hostname -i命令查看,如果显示的是127.0.0.1或者与本机实际IP不一致的话,需要把/etc/hosts文件中相应的地址改为本机实际IP。
&&&&&&(4)运行jstatd守护程序。由于jstatd需要保持一直运行,所以建议使用screen命令执行jstatd程序,命令如下:
screen jstatd -J-Djava.security.policy=jstatd.all.policy
如果需要RMI日志功能的话,还可以在启动参数中加入-J-Djava.rmi.server.logCalls=true。jstatd开始运行后,使用CTRL&#43;A&#43;D断开screen界面,回到shell界面。如果想切换回jstatd运行界面的话,使用screen -r -d命令即可。
&&&&&&(5)通过Java VisualVM连接到服务器监控Java程序。在Java VisualVM程序窗口左侧“远程”项目右键选择“添加远程主机”,在弹出的对话框中输入远程主机的IP地址,确认提交后即可看到相应的远程主机和在上面运行的Java程序,连接成功后应该会显示Jstatd及其PID。
转载地址:
由于在建项目的需要,监控tomcat的内存使用,检查内存泄漏的情况。其实JDK自身已经提供了很多工具,都在JAVA_HOME/bin/目录下:jvisualvm、jconsole、jstatd、jmap等等,以下为试验的环境配置:&
client: vista、jdk1.6.0_18server: linux、jdk1.6.0_02、tomcat6、IP:192.168.8.7
主要从下面三个方面描述:&
jmap (Memory Map) JVM内存对象打印工具jstatd配置Tomcat配置JMX
一、用jmap获取数据&
JAVA_HOME/bin/jmap -histo PID&
JAVA_HOME/bin/jmap -histo PID &hismem.txt&
显示信息包括Java类、类实例对象数量、在内存中占有量的大小以及类的完整包名。&
//将JVM内存堆的信息dump成为一个二进制文件,可供jstat、Eclipse MAT内存分析工具来使用&
JAVA_HOME/bin/jmap -dump:format=b,file=heap.bin PID&
Eclipse MAT的分析工具:&
二:jstatd配置&
需要在被监控的服务器上面,通过jstatd来启动RMI服务。&
&&&& 新建个文件jstatd.all.policy 文件内容如下:&
Java代码&&
grant&codebase&&file:${java.home}/../lib/tools.jar&&{&&
&&&&permission&java.security.AllP&&
启动命令如下:&
Java代码&&
jstatd&-J-Djava.security.policy=jstatd.all.policy&&
jstatd&-J-Djava.rmi.server.hostname=192.168.8.7&&
-J-Djava.security.policy=test/jstatd.all.policy&&
jstatd&-J-Djava.rmi.server.hostname=192.168.8.7&&
-J-Djava.security.policy=test/jstatd.all.policy&-p&8888&&
jstatd&-J-Djava.rmi.server.hostname=192.168.8.7&&
-J-Djava.security.policy=test/jstatd.all.policy&&
-J-Dcom.sun.management.jmxremote.port=8888&&
-J-Dcom.sun.management.jmxremote.ssl=false&&
-J-Dcom.sun.management.jmxremote.authenticate=false&&
nohup&jstatd&-J-Djava.rmi.server.hostname=192.168.8.7&&
-J-Djava.security.policy=test/jstatd.all.policy&-p&8888&&&&
&&& 启动通过:netstat -an|grep 8888可以查看端口是否已经被监听&
&&& 用JAVA_HOME/bin/jmap 查看java进程:&
Java代码&&
jps&192.168.8.7&&
jps&rmi:&&
打开jvisualvm 界面如下:&
右击远程 选择添加远程主机:&
如果重新指定了jstatd端口,选择高级设置修改端口,如下图:&
如果同时配置了JMX,可以在添加JMX连接如下图:&
添加后如图所示:&
三:Tomcat配置JMX&
& 用hostname -i 查看是否为127.0.0.1,这步非常重要,否则会连接失败,如果是,必须要配置-Djava.rmi.server.hostname
比如我的配置为 -Djava.rmi.server.hostname=192.168.8.7,而不需要修改hosts文件,修改此文件还可能影响到其他程序。&
& 只需要在TOMCAT_HOME/bin/找到catalina.sh 加上以下参数,重新启动tomcat就可以了:&
JAVA_OPTS=&$JAVA_OPTS&-Djava.rmi.server.hostname=192.168.8.7&&
-Dcom.sun.management.jmxremote.port=8088&&
-Dcom.sun.management.jmxremote.ssl=false&&
-Dcom.sun.management.jmxremote.authenticate=false&&&
& 打开JAVA_HOME/bin/下的jvisualvm 或者jconsole 的工具可以直接连接了,如下图visualvm连接的示意图:&
& 也可以写个Java类TestJMXClient.java测试下JMX连接是否成功:
Java代码&&
import&java.util.HashM&&
import&java.util.M&&
import&javax.management.MBeanServerC&&
import&javax.management.remote.JMXC&&
import&javax.management.remote.JMXConnectorF&&
import&javax.management.remote.JMXServiceURL;&&
public&class&TestJMXClient&{&&
&&&&public&static&void&main(String[]&args)&{&&
&&&&&&&&try&{&&
&&&&&&&&&&&&String&jndiPath&=&&jmxrmi&;&&
&&&&&&&&&&&&String&serverhost&=&&192.168.8.7&;&&
&&&&&&&&&&&&String&serverport&=&&8088&;&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&String&jmxurl&=&&service:jmx:rmi:///jndi/rmi://&&&#43;&serverhost&&#43;&&:&&&
&&&&&&&&&&&&&&&&&&&&&#43;&serverport&&#43;&&/&&&#43;&jndiP&&
&&&&&&&&&&&&System.out.println(&jmxurl:&&&#43;&jmxurl);&&
&&&&&&&&&&&&JMXServiceURL&url&=&new&JMXServiceURL(jmxurl);&&
&&&&&&&&&&&&Map&String,&Object&&enviMap&=&new&HashMap&String,&Object&();&&
&&&&&&&&&&&&JMXConnector&connector&=&JMXConnectorFactory.connect(url,&enviMap);&&
&&&&&&&&&&&&MBeanServerConnection&mbsc&=&connector.getMBeanServerConnection();&&
&&&&&&&&&&&&System.out.println(&successful&connected&&);&&
&&&&&&&&&&&&connector.close();&&
&&&&&&&&&&&&System.out.println(&close&connect&);&&
&&&&&&&&}&catch&(Exception&e)&{&&
&&&&&&&&&&&&System.out.println(&error&);&&
&&&&&&&&&&&&e.printStackTrace();&&
&&&&&&&&}&&
ps:JMX Management and Monitoring Properties&
com.sun.management.jmxremote
true / false. Default is true
com.sun.management.jmxremote. port
Port number. No default.
com.sun.management.jmxremote.ssl
true / false. Default is true.
com.sun.management.jmxremote.ssl.enabled.protocols
Default SSL/TLS protocol version.
com.sun.management.jmxremote.ssl.enabled.cipher.suites
Default SSL/TLS cipher suites.
com.sun.management.jmxremote.ssl.need.client.auth
true / false. Default is false
com.sun.management.jmxremote.authenticate
true / false.Default is true
com.sun.management.jmxremote.password.file
JRE_HOME/lib/management/jmxremote.password
com.sun.management.jmxremote.access.file
JRE_HOME/lib/management/jmxremote.access
com.sun.management.jmxremote.login.config
Default login configuration is a file-based password authentication.
转载地址:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:520075次
积分:7026
积分:7026
排名:第2269名
原创:37篇
转载:918篇
(1)(5)(20)(42)(17)(2)(1)(5)(5)(2)(6)(65)(51)(36)(88)(46)(34)(20)(61)(111)(102)(73)(17)(54)(45)(23)(16)(3)(3)(3)java gc,java内存分析(性能测试总结之内存泄露和内存溢出) - 测试天堂 - 51Testing软件测试网 51Testing软件测试网-中国软件测试人的精神家园
java gc,java内存分析(性能测试总结之内存泄露和内存溢出)
& 19:10:51
/ 个人分类:
&1. Java内存泄露监控工具&2.&&性能总结之内存泄露和内存溢出刚刚做完了一个项目的,“有幸”也遇到了内存泄露的案例,所以在此和大家分享一下。主要从以下几部分来说明,关于内存和内存泄露、溢出的概念,区分内存泄露和内存溢出;内存的区域划分,了解GC回收机制;重点关注如何去监控和发现内存问题;此外分析出问题还要如何解决内存问题。下面就开始本篇的内容:第一部分 概念众所周知,中的内存java虚拟机自己去管理的,他不想C++需要自己去释放。笼统地去讲,java的内存分配分为两个部分,一个是数据堆,一个是栈。程序在运行的时候一般分配数据堆,把局部的临时的变量都放进去,生命周期和进程有关系。但是如果程序员声明了static的变量,就直接在栈中运行的,进程销毁了,不一定会销毁static变量。另外为了保证java内存不会溢出,java中有垃圾回收机制。 System.gc()即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存。java语言并不要求jvm有gc,也没有规定gc如何。垃圾收集的目的在于清除不再使用的对象。gc通过确定对象是否被活动对象引用来确定是否收集该对象。而其中,内存溢出就是你要求分配的java虚拟机内存超出了系统能给你的,系统不能满足需求,于是产生溢出。内存泄漏是指你向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),结果你申请到的那块内存你自己也不能再访问,该块已分配出来的内存也无法再使用,随着服务器内存的不断消耗,而无法使用的内存越来越多,系统也不能再次将它分配给需要的程序,产生泄露。一直下去,程序也逐渐无内存使用,就会溢出。第二部分 原理JAVA垃圾回收及对内存区划分在Java虚拟机规范中,提及了如下几种类型的内存空间:◇ 栈内存(Stack):每个线程私有的。◇ 堆内存(Heap):所有线程公用的。◇ 方法区(Method Area):有点像以前常说的“进程代码段”,这里面存放了每个加载类的反射信息、类函数的代码、编译时常量等信息。◇ 原生方法栈(Native Method Stack):主要用于JNI中的原生代码,平时很少涉及。而Java的使用的是堆内存,java堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,“垃圾回收”也是主要是和堆内存(Heap)有关。垃圾回收的概念就是JAVA虚拟机(JVM)回收那些不再被引用的对象内存的过程。一般我们认为正在被引用的对象状态为“alive”,而没有被应用或者取不到引用属性的对象状态为“dead”。垃圾回收是一个释放处于”dead”状态的对象的内存的过程。而垃圾回收的规则和算法被动态的作用于应用运行当中,自动回收。JVM的垃圾回收器采用的是一种分代(generational )回收策略,用较高的频率对年轻的对象(young generation)进行扫描和回收,这种叫做minor collection,而对老对象(old generation)的检查回收频率要低很多,称为major collection。这样就不需要每次GC都将内存中所有对象都检查一遍,这种策略有利于实时观察和回收。(Sun JVM 1.3 有两种最基本的内存收集方式:一种称为copying或scavenge,将所有仍然生存的对象搬到另外一块内存后,整块内存就可回收。这种方法有效率,但需要有一定的空闲内存,拷贝也有开销。这种方法用于minor collection。另外一种称为mark-compact,将活着的对象标记出来,然后搬迁到一起连成大块的内存,内存就可以回收了。这种方法不需要占用额外的空间,但速度相对慢一些。这种方法用于major collection. )一些对象被创建出来只是拥有短暂的生命周期,比如 iterators 和本地变量。另外一些对象被创建是拥有很长的生命周期,比如 高持久化对象等。垃圾回收器的分代策略是把内存区划分为几个代,然后为每个代分配一到多个内存区块。当其中一个代用完了分配给他的内存后,JVM会在分配的内存区内执行一个局部的GC(也可以叫minor collection)操作,为了回收处于“dead”状态的对象所占用的内存。局部GC通常要不Full GC要快很多。JVM定义了两个代,年轻代(yong generation)(有时称为“nursery”托儿所)和老年代(old generation)。年轻代包括 “Eden space(伊甸园)”和两个“survivor spaces”。虚拟内存初始化的时候会把所有对象都分配到 Eden space,并且大部分对象也会在该区域被释放。 当进行& minor GC的时候,VM会把剩下的没有释放的对象从Eden space移动到其中一个survivor spaces当中。此外,VM也会把那些长期存活在survivor spaces 里的对象移动到 老生代的“tenured” space中。当 tenured generation 被填满后,就会产生Full GC,Full GC会相对比较慢因为回收的内容包括了所有的 live状态的对象。pemanet generation这个代包括了所有java虚拟机自身使用的相对比较稳定的数据对象,比如类和对象方法等。关于代的划分,可以从下图中获得一个概况:如果垃圾回收器影响了系统的性能,或者成为系统的瓶颈,你可以通过自定义各个代的大小来优化它的性能。使用JConsole,可以方便的查看到当前应用所配置的垃圾回收器的各个参数。想要获得更详细的参数,可以参考以下调优介绍:Tuning Garbage collection with the 5.0 HotSpot VM最后,总结一下各区内存:Eden Space (heap): 内存最初从这个线程池分配给大部分对象。Survivor Space (heap):用于保存在eden space内存池中经过垃圾回收后没有被回收的对象。Tenured Generation (heap):用于保持已经在 survivor space内存池中存在了一段时间的对象。Permanent Generation (non-heap): 保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。Java虚拟机共享这些类数据。这个区域被分割为只读的和只写的,Code Cache (non-heap):HotSpot Java虚拟机包括一个用于编译和保存本地代码(native code)的内存,叫做“代码缓存区”(code cache)第三部分 监控(工具发现问题)谈到内存监控工具,JConsole是必须要介绍的,它是一个用JAVA写的GUI程序,用来监控VM,并可监控远程的VM,易用且功能强大。具体可监控JAVA内存、JAVA CPU使用率、线程执行情况、加载类概况等,Jconsole需要在JVM参数中配置端口才能使用。由于是GUI程序,界面可视化,这里就不做详细介绍,具体帮助支持文档请参阅性能测试JConsole使用方法总结:或者参考SUN官网的技术文档:在实际测试某一个项目时,内存出现泄露现象。起初在性能测试的1个小时中,并不明显,而在稳定性测试的时候才发现,应用的HSF调用在经过几个小时运行后,就出现性能明显下降的情况。在服务中报大量HSF超时,但所调用系统没有任何超时日志,并且压力应用的load都很低。经过查看日志后,认为应用可能存在内存泄漏。通过jconsole 以及 jmap 工具进行分析发现,确实存在内存泄漏问题,其中PS Old Gen最终达到占用 100%的占用。如图所示:从上图可以看到,虽然每次Full GC,JVM内存会有部分回收,但回收并不彻底,不可回收的内存对象会越来越多,这样便会出现以上的一个趋势。在Full GC无法回收的对象越来越多时,最终已使用内存达到系统分配的内存最大值,系统最后无内存可分配,最终down机。第四部分 分析经过开发和架构师对应用的分析,查看此时内存队列,看哪个对象占用数据最多,再利用jmap命令,对线程数据分析,如下所示:num&&&& #instances&&&&&&&& #bytes& class name———————————————-1:&&&&&& 9248056&&&&&&&&& com.taobao.matrix.mc.domain.**2:&&&&&& 9248031&&&&&&&&& com.taobao.matrix.**3:&&&&&& 9248068&&&&&&&&& java.util.**4:&&&&&& 1542111&&&&&&& && java.util.Date前三个instances不断增加,指代的是同一个代码逻辑,异步分发的问题,堵塞消息,回收多次都无法回收成功。导致内存溢出。此外,对应用的性能单独做了压测,他的性能只能支撑到一半左右,故发送消息的TPS,应用肯定无法处理过来,导致消息堆积,而JAVA垃圾回收期认为这些都是有用的对象,导致内存堆积,直至系统崩溃。调优方法由于具体调优方法涉及到应用的配置信息,故在此暂不列出,可以参考性能测试小组发布的《性能测试调优宝典》第四部分 总结内存溢出主要是由于代码编写时对某些方法、类应用不合理,或者没有预估到临时对象会占用很大内存量,或者把过多的数据放入JVM缓存,或者性能压力大导致消息堆积而占用内存,以至于在性能测试时,生成庞大数量的临时对象,GC时没有做出有效回收甚至根本就不能回收,造成内存空间不足,内存溢出。如果编码之前,对内存使用量进行预估,对放在内存中的数据进行评估,保证有用的信息尽快释放,无用的信息能够被GC回收,这样在一定程度上是可以避免内存溢出问题的。&&3. java gc监视方法与工具项目需要,将gc的监视方法,和gc log的分析工具整理一下,问题一& 让jvm输出log打印jvm的gc log, 需要如下配置jvm启动参数:方法1:-Xloggc:D:/gc.log方法2-Xloggc:D:/gc.log -XX:+PrintGCTimeStamps -XX:-PrintGCDetails -XX:+UseConcMarkSweepGC&这些jvm启动参数的意义参考这里:问题二& 分析jvm的log我现在用的是HPjmeter, 和HPjtune,收费的东西公司用不了, 没调查, 但目前这两个基本满足了我的需求.网上有这么一篇blog:. 里面有各种工具的下载地址.整理如下:下载:下载:(支持目录方式浏览。)这篇blog中还介绍了其他的一些gc分析工具,同时也给出了相应的下载地址, 分别是:SAP Memory Analyzer(Eclipse插件),& gcviewer,& scimark2 benchmark&&4.用HPjtune分析GC日志(一个实际案例的诊断过程)&&}

我要回帖

更多关于 java内存溢出怎么解决 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信