锁定老帖子 主题:关于java堆栈溢出的那些事
精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-04
sun 自带的工具里面jmap jhat 可以解决你的问题 。
|
|
返回顶楼 | |
发表时间:2009-09-05
bencode 写道 teasp 写道 jrockit免费的?太好了,这个工具在linux下能用不?
另外,楼主这句“用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的”是严重错误的。 看楼主的截图, jrockit是基于eclipse平台开发的RCP程序,肯定可以在linux下使用。 去找找看。应该有linux的下载链接的 对的,他是可以跨平台的。。 |
|
返回顶楼 | |
发表时间:2009-09-05
hsbljyy 写道
jinyanhui2008 写道
hsbljyy 写道
jinyanhui2008 写道
在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。 用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。
是啊,太具体的也没有深入研究,肯定是还有其他地方在引用,我也说不上来是为啥,做程序员坐久了有的时候就没时间去深究了,已解决问题为最终目标了。 我说的那段话,因为我开始是每次用用到那个变量或者类的时候都去new一下,而且那个东西可能会频繁的访问,所以造成了资源的很大浪费,所以才写了上面的那段话。
|
|
返回顶楼 | |
发表时间:2009-09-07
jinyanhui2008 写道 这个问题,我是在别的网站上看的,所以才这么说的,要调试远程程序,远程使用的jre要用Jrockit的jre才行,具体怎么回事我找不到当时哪个网址了,记不得了。 但是他再生产环境下调试本地程序是没问题的,这是我已经测试过的。 或者我说的堆栈溢出并不准确,我觉得能解决问题才是最大的。 调试远程程序和使用JRockit没有关系,在JVM的规范中本来就有了JPDA(Java Platform Debug Architecture)。当然了,你还是需要使用某些工具来实现可视化的分析的,但并不只有JRockit而已。 解决问题自然是关键,但是对于问题的描述和分析,是你解决问题的前提。有些细节会让别人觉得你是否专业,尤其是你想去和别人分享你的经验的时候,请一定注意。 |
|
返回顶楼 | |
发表时间:2009-09-07
hsbljyy 写道
jinyanhui2008 写道
在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。 用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。
一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。 |
|
返回顶楼 | |
发表时间:2009-09-07
凤舞凰扬 写道
hsbljyy 写道
jinyanhui2008 写道
在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。 用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。
一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。 哦。明白了一点 |
|
返回顶楼 | |
发表时间:2009-09-07
我一直在用JProfiler,感觉挺好用的,
|
|
返回顶楼 | |
发表时间:2009-09-07
大家回帖时,请注意语言表达谨慎,正确,简练。语言例如 “我记不得了”,“我忘了”,“随便看了一看”,给读者一种十分不专业的印象,也无益与培养软件工程师的职业精神。
|
|
返回顶楼 | |
发表时间:2009-09-07
以前一直用 Yourkit JProfiler, 可以申请 Evaluation 的 License, 分析性能死锁问题的时候够用了。
现在一般的分析也会用 JDK 自带的 jvisualvm,还是能看到很多信息的,使用也很方便,而且免费,不用找xxx,呵呵。 vinter 写道 我一直在用JProfiler,感觉挺好用的,
|
|
返回顶楼 | |
发表时间:2009-09-08
凤舞凰扬 写道
hsbljyy 写道
jinyanhui2008 写道
在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。 用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。
一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。
我说的“用static修饰的也一样”,指的是修饰的变量所指向的对象,是我没有表述清楚,造成了误会,实在是抱歉。
就像你说的,栈存放的东西过多也会内存溢出,呵呵,不过我还没碰到过这样的事情。
据说栈的速度比堆的速度快(貌似是算法决定的,堆比较灵活,但牺牲了速度;而栈刚好相反;是不是这样我不知道,没经过测试。),但貌似栈的内存空间比较小,所以如果放置了太多东西,就容易出现内存溢出。
这些都是我看到的一些理论知识,没有经过试验,也不知道是否正确,还请各位指点。 |
|
返回顶楼 | |