首页>java频道>java教程>正文
浅谈Java堆栈溢出的机制与原理

www.zige365.com 2010-6-7 12:29:15 点击:发送给好友 和学友门交流一下 收藏到我的会员中心

Java堆栈溢出的出现,很让人痛苦的事情,很多时候都无法找到头绪。这里作者通过使用jrockit调用程序才最终发现了问题的所在。在很多情况下,Java堆栈溢出,很有可能是你的代码中用到数组,到你的索引超出范围了。

java.lang.OutOfMemoryError: Java heap space

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

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

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

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

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

具体调试步骤

(一)

启动调试程序

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

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

(二)

跟踪

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

(三)

内存的释放

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

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

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

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

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

写完手工。

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

我要投稿 新闻来源: 编辑: 作者:
相关新闻
浅谈Java调用系统命令或可执行程序的方法介绍
关于介绍Java集合类(Collections)
浅谈学习Java基础语法
浅谈Java语言学习:概述
使用Comparable接口