java.lang.OutOfMemoryError: Java heap space
在java程序运行中可能会报如上的错误,通常是在运行过程中内存占用了没有别释放造成的。
以前可能没法跟踪可能是很痛苦的事情,现在好了,我们有一个调试软件可以用了,在生产环境下使用的jRockit软件进行调试,是oracle公司出品的。
前两天试用了一下真的很不错。
前阵子有个程序跑2个礼拜左右就会堆栈溢出,始终找不到头绪,后来使用jrockit才找到问题的出处。
jrockit是可以调试远程程序也可以调试本地程序的。
具体调试步骤
(一)
如果是调试本地程序的话,启动jrockit,然后启动本地需要调试的程序,会在左侧工具栏 本地目录下创建一个连接为需要调试的程序,在上面点击右键,就会启动跟踪。
如何跟踪呢,我的办法就是等,在跟踪开始后,进行截图,然后等程序运行一段时间后查找堆增长比较大的并且一直没有释放的变量。
(二)
然后在上面点击右键,显示分配跟踪。
(三)
然后找到对应的方法,然后就去找问题吧,看看是不是那个地方有内存一直没有释放啊。
然后说点我自己的小经验,也许是不对的,但是我在我的应用里面确实是有效的。
在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。
用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。
基本上jrockit跟踪是很强的,都能够找到你的问题所在,要仔细观察,改完程序后记得再重新跟踪下直到没有内存泄露为止。
写完手工。
题外话,写多线程的时候建议使用线程池来操作。