论坛首页 Java企业应用论坛

关于java堆栈溢出的那些事

浏览 25848 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-04  
sun 自带的工具里面jmap jhat  可以解决你的问题 。
0 请登录后投票
   发表时间:2009-09-05  
bencode 写道
teasp 写道
jrockit免费的?太好了,这个工具在linux下能用不?

另外,楼主这句“用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的”是严重错误的。


看楼主的截图, jrockit是基于eclipse平台开发的RCP程序,肯定可以在linux下使用。
去找找看。应该有linux的下载链接的

对的,他是可以跨平台的。。
0 请登录后投票
   发表时间:2009-09-05  
hsbljyy 写道
jinyanhui2008 写道
hsbljyy 写道
jinyanhui2008 写道

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

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


不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。

 

是啊,太具体的也没有深入研究,肯定是还有其他地方在引用,我也说不上来是为啥,做程序员坐久了有的时候就没时间去深究了,已解决问题为最终目标了。

我说的那段话,因为我开始是每次用用到那个变量或者类的时候都去new一下,而且那个东西可能会频繁的访问,所以造成了资源的很大浪费,所以才写了上面的那段话。


可能会频繁访问?我想知道你说的这个变量是Java的8种基本类型还是类对象,为什么频繁访问,如果是类对象,那么该对象有没有状态?个人感觉你说的还是太泛了,没有说到点上。至于你说的每次使用就new一个对象这种问题,可以参考数据库连接池的设计理念来解决。


是啊。程序设计确实还有很多地方值得我去研究,大多数地方我用了spring去管理了,只有几个类没有用spring来管理,然后就造成溢出了,哈哈不过现在搞好了,抽空真的要看看java设计思想了。。。要不永远只是个码代码的。

0 请登录后投票
   发表时间:2009-09-07  
jinyanhui2008 写道

这个问题,我是在别的网站上看的,所以才这么说的,要调试远程程序,远程使用的jre要用Jrockit的jre才行,具体怎么回事我找不到当时哪个网址了,记不得了。
但是他再生产环境下调试本地程序是没问题的,这是我已经测试过的。
或者我说的堆栈溢出并不准确,我觉得能解决问题才是最大的。

     调试远程程序和使用JRockit没有关系,在JVM的规范中本来就有了JPDA(Java Platform Debug Architecture)。当然了,你还是需要使用某些工具来实现可视化的分析的,但并不只有JRockit而已。
     解决问题自然是关键,但是对于问题的描述和分析,是你解决问题的前提。有些细节会让别人觉得你是否专业,尤其是你想去和别人分享你的经验的时候,请一定注意。
0 请登录后投票
   发表时间:2009-09-07  
hsbljyy 写道
jinyanhui2008 写道

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

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


不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。

 

    一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。

0 请登录后投票
   发表时间:2009-09-07  
凤舞凰扬 写道
hsbljyy 写道
jinyanhui2008 写道

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

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


不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。

 

    一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。

哦。明白了一点

0 请登录后投票
   发表时间:2009-09-07  
我一直在用JProfiler,感觉挺好用的,
0 请登录后投票
   发表时间:2009-09-07  
大家回帖时,请注意语言表达谨慎,正确,简练。语言例如 “我记不得了”,“我忘了”,“随便看了一看”,给读者一种十分不专业的印象,也无益与培养软件工程师的职业精神。
0 请登录后投票
   发表时间:2009-09-07  
以前一直用 Yourkit JProfiler, 可以申请 Evaluation 的 License, 分析性能死锁问题的时候够用了。

现在一般的分析也会用 JDK 自带的 jvisualvm,还是能看到很多信息的,使用也很方便,而且免费,不用找xxx,呵呵。

vinter 写道
我一直在用JProfiler,感觉挺好用的,

0 请登录后投票
   发表时间:2009-09-08  
凤舞凰扬 写道
hsbljyy 写道
jinyanhui2008 写道

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

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


不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。

 

    一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。


可能是我没有说清楚吧,造成了误会,不好意思。据我所知,对象创建完一般是放在堆中的,也就是你说的heap,static的变量的确是存放在栈当中,一般来说,只要jvm加载了class后,static修饰的变量就会放在栈当中,一般不会被jvm的GC回收。

 

我说的“用static修饰的也一样”,指的是修饰的变量所指向的对象,是我没有表述清楚,造成了误会,实在是抱歉。

 

就像你说的,栈存放的东西过多也会内存溢出,呵呵,不过我还没碰到过这样的事情。

 

据说栈的速度比堆的速度快(貌似是算法决定的,堆比较灵活,但牺牲了速度;而栈刚好相反;是不是这样我不知道,没经过测试。),但貌似栈的内存空间比较小,所以如果放置了太多东西,就容易出现内存溢出。

 

这些都是我看到的一些理论知识,没有经过试验,也不知道是否正确,还请各位指点。

0 请登录后投票
论坛首页 Java企业应用版

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