论坛首页 Java企业应用论坛

关于java堆栈溢出的那些事

浏览 25939 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-08-31   最后修改:2009-08-31

java.lang.OutOfMemoryError: Java heap space

在java程序运行中可能会报如上的错误,通常是在运行过程中内存占用了没有别释放造成的。

以前可能没法跟踪可能是很痛苦的事情,现在好了,我们有一个调试软件可以用了,在生产环境下使用的jRockit软件进行调试,是oracle公司出品的。

前两天试用了一下真的很不错。

前阵子有个程序跑2个礼拜左右就会堆栈溢出,始终找不到头绪,后来使用jrockit才找到问题的出处。

jrockit是可以调试远程程序也可以调试本地程序的。

具体调试步骤

(一)

启动调试程序

 

如果是调试本地程序的话,启动jrockit,然后启动本地需要调试的程序,会在左侧工具栏 本地目录下创建一个连接为需要调试的程序,在上面点击右键,就会启动跟踪。

如何跟踪呢,我的办法就是等,在跟踪开始后,进行截图,然后等程序运行一段时间后查找堆增长比较大的并且一直没有释放的变量。

(二)

然后在上面点击右键,显示分配跟踪。

(三)

然后找到对应的方法,然后就去找问题吧,看看是不是那个地方有内存一直没有释放啊。

 

然后说点我自己的小经验,也许是不对的,但是我在我的应用里面确实是有效的。

 

在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。

用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。

基本上jrockit跟踪是很强的,都能够找到你的问题所在,要仔细观察,改完程序后记得再重新跟踪下直到没有内存泄露为止。

写完手工。

题外话,写多线程的时候建议使用线程池来操作。

   发表时间:2009-08-31  
不错,实践出真知呀
0 请登录后投票
   发表时间:2009-08-31  
jrockit 应该是bea的吧,后来bea被oracle收购了
0 请登录后投票
   发表时间:2009-09-01  
SSailYang 写道
jrockit 应该是bea的吧,后来bea被oracle收购了

对的。。。开始我也想说是bea的,但是想了想既然被收购了,还是直接用oracle吧
0 请登录后投票
   发表时间:2009-09-01  
补充一点:楼主指的是jrockit的mission control. 使用他的时候需要使用jrockit jvm并在增加vm参数才可以。
另:jrockit的java runtime analyzer(jra)和memleak是需要lisense key的..开发人员免费用的好像才1个小时使用时间。。。。
楼主哪里弄的key?
0 请登录后投票
   发表时间:2009-09-02  
kekeemx 写道
补充一点:楼主指的是jrockit的mission control. 使用他的时候需要使用jrockit jvm并在增加vm参数才可以。
另:jrockit的java runtime analyzer(jra)和memleak是需要lisense key的..开发人员免费用的好像才1个小时使用时间。。。。
楼主哪里弄的key?


bea被oracle收购后,此软件已经免费了,另外我是调试本地程序,所以使用Oracle JRockit Mission Control 就可以了,如果要调试远程客户端的话,需要在远程客户端安装jvm才行,并且需要填上相应的启动参数。
0 请登录后投票
   发表时间:2009-09-02   最后修改:2009-09-02
   首先给楼主一个翻译的错误,OutOfMemory是内存不够分配对象(可能是heap,也可能是permgen,也可能是其他的内存分配),堆栈溢出指的是StackOverflow。
    另外Jrockit是个不错的东东,但也不是什么地方都能用。比如在生产环境中,是不会开放debug的方式给你远程监控JVM或者打印堆栈信息的(我都不明白楼主的公司怎么可能开放生产环境用于调试)。
     所以,建议楼主是用JDK自带的命令吧。如果是用SUN的JDK,可以在重启服务器的时候使用jmap打印出heap中Oldgen的堆(dump file)或者是使用-XX:-HeapDumpOnOutOfMemoryError 使JVM在出现outofmemory的时候dump出内存信息。 这样你可以用许多工具进行分析,包括Jrockit以及Eclipse的MAT了。
5 请登录后投票
   发表时间:2009-09-03  
凤舞凰扬 写道
   首先给楼主一个翻译的错误,OutOfMemory是内存不够分配对象(可能是heap,也可能是permgen,也可能是其他的内存分配),堆栈溢出指的是StackOverflow。
    另外Jrockit是个不错的东东,但也不是什么地方都能用。比如在生产环境中,是不会开放debug的方式给你远程监控JVM或者打印堆栈信息的(我都不明白楼主的公司怎么可能开放生产环境用于调试)。
     所以,建议楼主是用JDK自带的命令吧。如果是用SUN的JDK,可以在重启服务器的时候使用jmap打印出heap中Oldgen的堆(dump file)或者是使用-XX:-HeapDumpOnOutOfMemoryError 使JVM在出现outofmemory的时候dump出内存信息。 这样你可以用许多工具进行分析,包括Jrockit以及Eclipse的MAT了。

这个问题,我是在别的网站上看的,所以才这么说的,要调试远程程序,远程使用的jre要用Jrockit的jre才行,具体怎么回事我找不到当时哪个网址了,记不得了。
但是他再生产环境下调试本地程序是没问题的,这是我已经测试过的。
或者我说的堆栈溢出并不准确,我觉得能解决问题才是最大的。
0 请登录后投票
   发表时间:2009-09-03  
lz 的jrockit mission control 哪里下载的,在官网上要注册才能下载,注册不了。
也想玩玩这个工具。
0 请登录后投票
   发表时间:2009-09-03  
强 我正在找PROFILE工具
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics