Java堆栈溢出的机制与原理

开发 后端
这里将介绍Java堆栈溢出的机制与原理,本文将从一个实际调试软件的例子出发,来进行讲解。希望本文能对大家有所帮助。
Java堆栈溢出的出现,很让人痛苦的事情,很多时候都无法找到头绪。这里作者通过使用jrockit调用程序才最终发现了问题的所在。在很多情况下,Java堆栈溢出,很有可能是你的代码中用到数组,到你的索引超出范围了。

java.lang.OutOfMemoryError: Java heap space

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

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

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

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

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

具体调试步骤

(一)

启动调试程序

 

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

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

(二)

跟踪

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

(三)

内存的释放

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

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

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

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

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

写完手工。

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

【编辑推荐】

  1. Java对象的序列化和反序列化实践
  2. Java程序性能优化之找出内存溢出元凶
  3. 2009年十大Java技术解决方案
  4. 有关Java线程机制的浅析
  5. 如何优化JavaScript脚本的性能
责任编辑:彭凡 来源: javaeye
相关推荐

2012-11-27 16:03:00

堆栈溢出

2012-11-27 15:46:51

堆栈溢出

2022-05-07 08:27:42

缓冲区溢出堆栈

2016-11-11 00:39:59

Java可见性机制

2012-11-06 10:01:35

ContinuatioF#

2015-11-16 11:17:30

PHP底层运行机制原理

2023-05-08 00:08:51

Hive机制场景

2024-03-11 08:22:40

Java内存泄漏

2010-09-25 11:23:15

Java内存泄露

2009-08-28 10:18:48

Java序列化

2021-12-20 00:03:38

Webpack运行机制

2017-05-31 13:16:35

PHP运行机制原理解析

2011-06-13 10:21:25

QT 信号 槽机制

2012-11-27 15:41:41

2021-07-30 19:44:51

AndroidJava线程

2011-07-18 14:08:08

2010-05-19 13:29:59

2009-12-09 17:28:34

PHP垃圾回收机制

2017-01-11 22:51:39

2015-03-30 11:18:50

内存管理Android
点赞
收藏

51CTO技术栈公众号