- 浏览: 312139 次
- 性别:
- 来自: 青岛
文章分类
- 全部博客 (140)
- 技术笔记 (3)
- Dwr (1)
- 日常使用技巧 (11)
- eclipse使用技巧 (3)
- jxl使用技巧 (3)
- Struts2 (7)
- java 报表 (3)
- Webservices (2)
- Flex (15)
- vc,vc++ (11)
- Spring (6)
- j2me开发 (1)
- Java (27)
- Sql (11)
- Javascript (5)
- extjs (0)
- C# (8)
- jQuery (2)
- PHP (3)
- apache (4)
- sso单点登录 (1)
- linux (6)
- cisco vpn (1)
- android (1)
- MongoDB性能优化 (1)
- nosql (1)
- Java netbeans (1)
- js (1)
最新评论
-
jinyanhui2008:
hzq20100521 写道你好,我的需求这个有点不一样,我的 ...
spring 多数据库支持,动态切换数据库 -
hzq20100521:
你好,我的需求这个有点不一样,我的是系统启动的时候是连接的默认 ...
spring 多数据库支持,动态切换数据库 -
lbxhappy:
那如果tree.first()一开始就是最大的呢?是不是以后e ...
从bbs中看到的问题:从大量数据中取top100,整理的思路 -
programwyh:
jinyanhui2008 写道programwyh 写道我用 ...
使用jasperreports制作报表(导出pdf excel html) -
jinyanhui2008:
programwyh 写道我用java程序写的运用Jasper ...
使用jasperreports制作报表(导出pdf excel html)
java.lang.OutOfMemoryError: Java heap space
在java程序运行中可能会报如上的错误,通常是在运行过程中内存占用了没有别释放造成的。
以前可能没法跟踪可能是很痛苦的事情,现在好了,我们有一个调试软件可以用了,在生产环境下使用的jRockit软件进行调试,是oracle公司出品的。
前两天试用了一下真的很不错。
前阵子有个程序跑2个礼拜左右就会堆栈溢出,始终找不到头绪,后来使用jrockit才找到问题的出处。
jrockit是可以调试远程程序也可以调试本地程序的。
具体调试步骤
(一)
如果是调试本地程序的话,启动jrockit,然后启动本地需要调试的程序,会在左侧工具栏 本地目录下创建一个连接为需要调试的程序,在上面点击右键,就会启动跟踪。
如何跟踪呢,我的办法就是等,在跟踪开始后,进行截图,然后等程序运行一段时间后查找堆增长比较大的并且一直没有释放的变量。
(二)
然后在上面点击右键,显示分配跟踪。
(三)
然后找到对应的方法,然后就去找问题吧,看看是不是那个地方有内存一直没有释放啊。
然后说点我自己的小经验,也许是不对的,但是我在我的应用里面确实是有效的。
在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。
用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。
基本上jrockit跟踪是很强的,都能够找到你的问题所在,要仔细观察,改完程序后记得再重新跟踪下直到没有内存泄露为止。
写完手工。
题外话,写多线程的时候建议使用线程池来操作。
评论
48 楼
凤舞凰扬
2009-09-21
jinyanhui2008 写道
凤舞凰扬 写道
ZangXT 写道
jinyanhui2008 写道
那么在执行完了之后,如果stack中不为空的时候,将stack置为null,是否也会清空内存呢?
会的。
看一下根集的相关概念。
这段代码看得出是在方法体内部。如果是这样的话,不管你设置stack为null与否(因为stack没有被外部所引用),在执行完,进行MinorGC就会回收的。去在一个方法中设置局部变量为null是多余并且妨碍阅读的做法。
哦,可能没有问清楚,我想问的是stack为全局变量的情况下。如果将stack=null,是否会清空啊?或者如果在全局变量下不将stack=null是否会在类调用完成后清空呢?
你应该这样理解。当你把stack设置为null的时候,也就是你当前对象不存在对stack对象的引用,这样的话,也就降低了stack对象被根引用的可能性(比如说你当前对象存在根引用,那么它所引用的对象也不会被回收)。如果你的stack对象是在当前对象内创建的,如果没有传递到外部,那么它就会在GC时回收。(其实这里有一个比较的情况,也就是你当前对象如果也能确保不被根引用,那么去设置stack = null其实是多余的了,因为它会同当前对象一起在GC时回收。)
47 楼
youngJiang
2009-09-16
一直想找一个这样的工具,这下可好了,谢谢楼主
46 楼
andy54321
2009-09-14
NetBeans提供类似的内存监控功能,界面也有些相似;
JDK自带的JConsole也可辅助
JDK自带的JConsole也可辅助
45 楼
ZangXT
2009-09-12
http://developers.sun.com/learning/javaoneonline/2007/pdf/TS-2906.pdf
44 楼
jinyanhui2008
2009-09-12
凤舞凰扬 写道
ZangXT 写道
jinyanhui2008 写道
那么在执行完了之后,如果stack中不为空的时候,将stack置为null,是否也会清空内存呢?
会的。
看一下根集的相关概念。
这段代码看得出是在方法体内部。如果是这样的话,不管你设置stack为null与否(因为stack没有被外部所引用),在执行完,进行MinorGC就会回收的。去在一个方法中设置局部变量为null是多余并且妨碍阅读的做法。
哦,可能没有问清楚,我想问的是stack为全局变量的情况下。如果将stack=null,是否会清空啊?或者如果在全局变量下不将stack=null是否会在类调用完成后清空呢?
43 楼
zozoh
2009-09-11
这个贴有意思,哈哈
42 楼
凤舞凰扬
2009-09-10
ZangXT 写道
jinyanhui2008 写道
那么在执行完了之后,如果stack中不为空的时候,将stack置为null,是否也会清空内存呢?
会的。
看一下根集的相关概念。
这段代码看得出是在方法体内部。如果是这样的话,不管你设置stack为null与否(因为stack没有被外部所引用),在执行完,进行MinorGC就会回收的。去在一个方法中设置局部变量为null是多余并且妨碍阅读的做法。
41 楼
ZangXT
2009-09-10
jinyanhui2008 写道
那么在执行完了之后,如果stack中不为空的时候,将stack置为null,是否也会清空内存呢?
会的。
看一下根集的相关概念。
40 楼
jinyanhui2008
2009-09-10
C_J 写道
谢楼上的提醒
-static是类加载的时候申请的空间,同时static{}静态模块也是触发了类加载才做的动作;
-head确实是个笔误,呵呵~
-已在原贴更正,见原帖;
以下的代码的 stack=null, 改为 o=null
-static是类加载的时候申请的空间,同时static{}静态模块也是触发了类加载才做的动作;
-head确实是个笔误,呵呵~
-已在原贴更正,见原帖;
以下的代码的 stack=null, 改为 o=null
Stack stack=new Stack(); for(...) { Object o=new Object(); stack.push(o); //stack=null; 改为o=null;谢谢大家的提醒; o=null; }其中o这些对象是不会被GC回收的~
那么在执行完了之后,如果stack中不为空的时候,将stack置为null,是否也会清空内存呢?
39 楼
C_J
2009-09-09
谢楼上的提醒
-static是类加载的时候申请的空间,同时static{}静态模块也是触发了类加载才做的动作;
-head确实是个笔误,呵呵~
-已在原贴更正,见原帖;
以下的代码的 stack=null, 改为 o=null
-static是类加载的时候申请的空间,同时static{}静态模块也是触发了类加载才做的动作;
-head确实是个笔误,呵呵~
-已在原贴更正,见原帖;
以下的代码的 stack=null, 改为 o=null
Stack stack=new Stack(); for(...) { Object o=new Object(); stack.push(o); //stack=null; 改为o=null;谢谢大家的提醒; o=null; }其中o这些对象是不会被GC回收的~
38 楼
ZangXT
2009-09-09
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">那您能不能解释一下什么是堆,什么是栈?</div>
<p><br>可以看这个:<a href="http://zangxt.iteye.com/admin/blogs/440330">http://zangxt.iteye.com/admin/blogs/440330</a></p>
<p>不过我写的比较晦涩,可能看起来会有点累。</p>
<div class="quote_div">那您能不能解释一下什么是堆,什么是栈?</div>
<p><br>可以看这个:<a href="http://zangxt.iteye.com/admin/blogs/440330">http://zangxt.iteye.com/admin/blogs/440330</a></p>
<p>不过我写的比较晦涩,可能看起来会有点累。</p>
37 楼
ZangXT
2009-09-09
C_J 写道
完全错误?
1、static静态数据在加载JVM就初始化并分配存储空间;
基本数据类型存储在内存静态区
如:
像楼上说的"static变量所引用的对象是会可能在Heap中的"
如:
2、可以说new出来的空间都存储在head中,而栈中的变量在栈退出的时候就释放掉了。
3、GC的回收应该是这块head区域没有被引用了才自动释放,但是要注意类似如下情况:
1、static静态数据在加载JVM就初始化并分配存储空间;
基本数据类型存储在内存静态区
如:
public static int tmp;对象数据类型可能在head区
像楼上说的"static变量所引用的对象是会可能在Heap中的"
如:
public static Singleton instance=new Singleton();
2、可以说new出来的空间都存储在head中,而栈中的变量在栈退出的时候就释放掉了。
3、GC的回收应该是这块head区域没有被引用了才自动释放,但是要注意类似如下情况:
Stack stack=new Stack(); for(...) { Object o=new Object(); stack.push(o); } stack=null;其中o这些对象是不会被GC回收的~
1.static静态数据不是加载jvm时初始化,而是加载类的时候分配空间并初始化。空间分配在PermGen。这个前面已经有人讲了。
当然你也可以把PermGen叫做堆,不过也有说法称之为“非堆”,因为Class的信息,字符串常量池都在这里面。跟我们平时说的堆还是有所不同的。
public static Singleton instance=new Singleton();
这个instance变量肯定是在PermGen的,但是它引用的对象首先在young区分配内存,当然可能随着年龄的增长,对象也可能被移动到PermGen中。
2.head是heap的笔误?
3.实在看不明白这个例子。stack=null之后,原来在stack中的对象已经没有任何从根集出发的引用可达了,怎么可能不被回收呢?
36 楼
hsbljyy
2009-09-09
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">ZangXT 写道</div>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">凤舞凰扬 写道</div>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">jinyanhui2008 写道</div>
<div class="quote_div">
<p>在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。</p>
<p>用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。</p>
</div>
<p><br>不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。</p>
<p> </p>
</div>
<p> 一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。</p>
</div>
<p><br>可能是我没有说清楚吧,造成了误会,不好意思。据我所知,对象创建完一般是放在堆中的,也就是你说的heap,static的变量的确是存放在栈当中,一般来说,只要jvm加载了class后,static修饰的变量就会放在栈当中,一般不会被jvm的GC回收。</p>
<p> </p>
<p>我说的“用static修饰的也一样”,指的是修饰的变量所指向的对象,是我没有表述清楚,造成了误会,实在是抱歉。</p>
<p> </p>
<p>就像你说的,栈存放的东西过多也会内存溢出,呵呵,不过我还没碰到过这样的事情。</p>
<p> </p>
<p>据说栈的速度比堆的速度快(貌似是算法决定的,堆比较灵活,但牺牲了速度;而栈刚好相反;是不是这样我不知道,没经过测试。),但貌似栈的内存空间比较小,所以如果放置了太多东西,就容易出现内存溢出。</p>
<p> </p>
<p>这些都是我看到的一些理论知识,没有经过试验,也不知道是否正确,还请各位指点。</p>
</div>
<p><br>先理解一下什么是堆,什么是栈吧。基本完全错误。</p>
</div>
<p>那您能不能解释一下什么是堆,什么是栈?</p>
</div>
<p>刚刚重新温习了下堆和栈的知识,发现我关于static的说法的确有误,敬请原谅。</p>
<div class="quote_div">
<div class="quote_title">ZangXT 写道</div>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">凤舞凰扬 写道</div>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">jinyanhui2008 写道</div>
<div class="quote_div">
<p>在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。</p>
<p>用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。</p>
</div>
<p><br>不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。</p>
<p> </p>
</div>
<p> 一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。</p>
</div>
<p><br>可能是我没有说清楚吧,造成了误会,不好意思。据我所知,对象创建完一般是放在堆中的,也就是你说的heap,static的变量的确是存放在栈当中,一般来说,只要jvm加载了class后,static修饰的变量就会放在栈当中,一般不会被jvm的GC回收。</p>
<p> </p>
<p>我说的“用static修饰的也一样”,指的是修饰的变量所指向的对象,是我没有表述清楚,造成了误会,实在是抱歉。</p>
<p> </p>
<p>就像你说的,栈存放的东西过多也会内存溢出,呵呵,不过我还没碰到过这样的事情。</p>
<p> </p>
<p>据说栈的速度比堆的速度快(貌似是算法决定的,堆比较灵活,但牺牲了速度;而栈刚好相反;是不是这样我不知道,没经过测试。),但貌似栈的内存空间比较小,所以如果放置了太多东西,就容易出现内存溢出。</p>
<p> </p>
<p>这些都是我看到的一些理论知识,没有经过试验,也不知道是否正确,还请各位指点。</p>
</div>
<p><br>先理解一下什么是堆,什么是栈吧。基本完全错误。</p>
</div>
<p>那您能不能解释一下什么是堆,什么是栈?</p>
</div>
<p>刚刚重新温习了下堆和栈的知识,发现我关于static的说法的确有误,敬请原谅。</p>
35 楼
hsbljyy
2009-09-09
<div class="quote_title">C_J 写道</div>
<div class="quote_div">3、GC的回收应该是这块head区域没有被引用了才自动释放,但是要注意类似如下情况:<br><br><pre name="code" class="java">Stack stack=new Stack();
for(...)
{
Object o=new Object();
stack.push(o);
}
stack=null;
</pre>
其中o这些对象是不会被GC回收的~<br><br>
</div>
<p> </p>
<p>这点不是很理解。按照您这么说,容器类就很容易出现内存溢出?还是我的理解有误?</p>
<div class="quote_div">3、GC的回收应该是这块head区域没有被引用了才自动释放,但是要注意类似如下情况:<br><br><pre name="code" class="java">Stack stack=new Stack();
for(...)
{
Object o=new Object();
stack.push(o);
}
stack=null;
</pre>
其中o这些对象是不会被GC回收的~<br><br>
</div>
<p> </p>
<p>这点不是很理解。按照您这么说,容器类就很容易出现内存溢出?还是我的理解有误?</p>
34 楼
hsbljyy
2009-09-09
<div class="quote_title">ZangXT 写道</div>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">凤舞凰扬 写道</div>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">jinyanhui2008 写道</div>
<div class="quote_div">
<p>在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。</p>
<p>用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。</p>
</div>
<p><br>不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。</p>
<p> </p>
</div>
<p> 一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。</p>
</div>
<p><br>可能是我没有说清楚吧,造成了误会,不好意思。据我所知,对象创建完一般是放在堆中的,也就是你说的heap,static的变量的确是存放在栈当中,一般来说,只要jvm加载了class后,static修饰的变量就会放在栈当中,一般不会被jvm的GC回收。</p>
<p> </p>
<p>我说的“用static修饰的也一样”,指的是修饰的变量所指向的对象,是我没有表述清楚,造成了误会,实在是抱歉。</p>
<p> </p>
<p>就像你说的,栈存放的东西过多也会内存溢出,呵呵,不过我还没碰到过这样的事情。</p>
<p> </p>
<p>据说栈的速度比堆的速度快(貌似是算法决定的,堆比较灵活,但牺牲了速度;而栈刚好相反;是不是这样我不知道,没经过测试。),但貌似栈的内存空间比较小,所以如果放置了太多东西,就容易出现内存溢出。</p>
<p> </p>
<p>这些都是我看到的一些理论知识,没有经过试验,也不知道是否正确,还请各位指点。</p>
</div>
<p><br>先理解一下什么是堆,什么是栈吧。基本完全错误。</p>
</div>
<p>那您能不能解释一下什么是堆,什么是栈?</p>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">凤舞凰扬 写道</div>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">jinyanhui2008 写道</div>
<div class="quote_div">
<p>在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。</p>
<p>用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。</p>
</div>
<p><br>不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。</p>
<p> </p>
</div>
<p> 一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。</p>
</div>
<p><br>可能是我没有说清楚吧,造成了误会,不好意思。据我所知,对象创建完一般是放在堆中的,也就是你说的heap,static的变量的确是存放在栈当中,一般来说,只要jvm加载了class后,static修饰的变量就会放在栈当中,一般不会被jvm的GC回收。</p>
<p> </p>
<p>我说的“用static修饰的也一样”,指的是修饰的变量所指向的对象,是我没有表述清楚,造成了误会,实在是抱歉。</p>
<p> </p>
<p>就像你说的,栈存放的东西过多也会内存溢出,呵呵,不过我还没碰到过这样的事情。</p>
<p> </p>
<p>据说栈的速度比堆的速度快(貌似是算法决定的,堆比较灵活,但牺牲了速度;而栈刚好相反;是不是这样我不知道,没经过测试。),但貌似栈的内存空间比较小,所以如果放置了太多东西,就容易出现内存溢出。</p>
<p> </p>
<p>这些都是我看到的一些理论知识,没有经过试验,也不知道是否正确,还请各位指点。</p>
</div>
<p><br>先理解一下什么是堆,什么是栈吧。基本完全错误。</p>
</div>
<p>那您能不能解释一下什么是堆,什么是栈?</p>
33 楼
C_J
2009-09-09
完全错误?
我提炼一下我觉得正确的几点;
1、“对象创建完一般是放在堆中的,也就是你说的heap”
2、“栈的内存空间比较小”
其他的几点关于static和GC回收的有问题
我的理解
1、static静态数据在加载JVM就初始化并分配存储空间;(已由楼下的兄弟更正,static变量和static模块是在类加载触发的时候申请的内存空间)
都存储在JVM分出来heap中的PermGen区。
2、可以说new出来的空间都存储在head中,而栈中的变量在栈退出的时候就释放掉了。
3、GC的回收应该是这块head区域没有被引用了才自动释放,但是要注意类似如下情况:
以下是以前看到内存泄漏看到的,时间看的太远了,所以写的时候难免疏忽了,不好意思,特在此标识出来;
另外找到了文章的出处:http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/index.html
以下的代码的 stack=null, 改为 o=null
我提炼一下我觉得正确的几点;
1、“对象创建完一般是放在堆中的,也就是你说的heap”
2、“栈的内存空间比较小”
其他的几点关于static和GC回收的有问题
我的理解
1、static静态数据在加载JVM就初始化并分配存储空间;(已由楼下的兄弟更正,static变量和static模块是在类加载触发的时候申请的内存空间)
都存储在JVM分出来heap中的PermGen区。
2、可以说new出来的空间都存储在head中,而栈中的变量在栈退出的时候就释放掉了。
3、GC的回收应该是这块head区域没有被引用了才自动释放,但是要注意类似如下情况:
以下是以前看到内存泄漏看到的,时间看的太远了,所以写的时候难免疏忽了,不好意思,特在此标识出来;
另外找到了文章的出处:http://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/index.html
以下的代码的 stack=null, 改为 o=null
Stack stack=new Stack(); for(...) { Object o=new Object(); stack.push(o); stack=null;// 改为o=null;谢谢大家的提醒; }其中o这些对象是不会被GC回收的~
32 楼
ZangXT
2009-09-08
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">凤舞凰扬 写道</div>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">jinyanhui2008 写道</div>
<div class="quote_div">
<p>在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。</p>
<p>用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。</p>
</div>
<p><br>不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。</p>
<p> </p>
</div>
<p> 一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。</p>
</div>
<p><br>可能是我没有说清楚吧,造成了误会,不好意思。据我所知,对象创建完一般是放在堆中的,也就是你说的heap,static的变量的确是存放在栈当中,一般来说,只要jvm加载了class后,static修饰的变量就会放在栈当中,一般不会被jvm的GC回收。</p>
<p> </p>
<p>我说的“用static修饰的也一样”,指的是修饰的变量所指向的对象,是我没有表述清楚,造成了误会,实在是抱歉。</p>
<p> </p>
<p>就像你说的,栈存放的东西过多也会内存溢出,呵呵,不过我还没碰到过这样的事情。</p>
<p> </p>
<p>据说栈的速度比堆的速度快(貌似是算法决定的,堆比较灵活,但牺牲了速度;而栈刚好相反;是不是这样我不知道,没经过测试。),但貌似栈的内存空间比较小,所以如果放置了太多东西,就容易出现内存溢出。</p>
<p> </p>
<p>这些都是我看到的一些理论知识,没有经过试验,也不知道是否正确,还请各位指点。</p>
</div>
<p><br>先理解一下什么是堆,什么是栈吧。基本完全错误。</p>
<div class="quote_div">
<div class="quote_title">凤舞凰扬 写道</div>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">jinyanhui2008 写道</div>
<div class="quote_div">
<p>在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。</p>
<p>用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。</p>
</div>
<p><br>不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。</p>
<p> </p>
</div>
<p> 一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。</p>
</div>
<p><br>可能是我没有说清楚吧,造成了误会,不好意思。据我所知,对象创建完一般是放在堆中的,也就是你说的heap,static的变量的确是存放在栈当中,一般来说,只要jvm加载了class后,static修饰的变量就会放在栈当中,一般不会被jvm的GC回收。</p>
<p> </p>
<p>我说的“用static修饰的也一样”,指的是修饰的变量所指向的对象,是我没有表述清楚,造成了误会,实在是抱歉。</p>
<p> </p>
<p>就像你说的,栈存放的东西过多也会内存溢出,呵呵,不过我还没碰到过这样的事情。</p>
<p> </p>
<p>据说栈的速度比堆的速度快(貌似是算法决定的,堆比较灵活,但牺牲了速度;而栈刚好相反;是不是这样我不知道,没经过测试。),但貌似栈的内存空间比较小,所以如果放置了太多东西,就容易出现内存溢出。</p>
<p> </p>
<p>这些都是我看到的一些理论知识,没有经过试验,也不知道是否正确,还请各位指点。</p>
</div>
<p><br>先理解一下什么是堆,什么是栈吧。基本完全错误。</p>
31 楼
srdrm
2009-09-08
java6就自带有监视工具
30 楼
hsbljyy
2009-09-08
<div class="quote_title">凤舞凰扬 写道</div>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">jinyanhui2008 写道</div>
<div class="quote_div">
<p>在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。</p>
<p>用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。</p>
</div>
<p><br>不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。</p>
<p> </p>
</div>
<p> 一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。</p>
</div>
<p><br>可能是我没有说清楚吧,造成了误会,不好意思。据我所知,对象创建完一般是放在堆中的,也就是你说的heap,static的变量的确是存放在栈当中,一般来说,只要jvm加载了class后,static修饰的变量就会放在栈当中,一般不会被jvm的GC回收。</p>
<p> </p>
<p>我说的“用static修饰的也一样”,指的是修饰的变量所指向的对象,是我没有表述清楚,造成了误会,实在是抱歉。</p>
<p> </p>
<p>就像你说的,栈存放的东西过多也会内存溢出,呵呵,不过我还没碰到过这样的事情。</p>
<p> </p>
<p>据说栈的速度比堆的速度快(貌似是算法决定的,堆比较灵活,但牺牲了速度;而栈刚好相反;是不是这样我不知道,没经过测试。),但貌似栈的内存空间比较小,所以如果放置了太多东西,就容易出现内存溢出。</p>
<p> </p>
<p>这些都是我看到的一些理论知识,没有经过试验,也不知道是否正确,还请各位指点。</p>
<div class="quote_div">
<div class="quote_title">hsbljyy 写道</div>
<div class="quote_div">
<div class="quote_title">jinyanhui2008 写道</div>
<div class="quote_div">
<p>在经常需要调用的地方将变量设成全局的甚至是静态的,我的操作是设成全局的了。图省事呢。呵呵,因为我的变量时全局都要调用的而且是频繁调用的。</p>
<p>用完的变量一定要记得让它等于null,否则执行gc()貌似是不给回收的。</p>
</div>
<p><br>不是很明白你这句话中的全局变量指的是什么。如果指的是对象范围内的全局变量,那么在这个对象没有被外部引用的时候,gc应该会处理好这些关系。没有被gc回收的原因肯定是你这个变量指向的对象还存在其他的引用,用static修饰的也一样,除非你用的是static final修饰。</p>
<p> </p>
</div>
<p> 一般来说,全局变量指的就是类的可变属性,也就是你所说的对象范围内的全局变量。同时纠正一点,static的变量是存储在PermGen空间中,而不是heap中(当然了,static变量所引用的对象是会可能在Heap中的),PermGen过大也会超出内存溢出的错误。并且static变量引用的对象属于根引用的序列中,所以即使没有了任何其他引用,一样不会被GC回收,所以你举的这个例子是不对的。</p>
</div>
<p><br>可能是我没有说清楚吧,造成了误会,不好意思。据我所知,对象创建完一般是放在堆中的,也就是你说的heap,static的变量的确是存放在栈当中,一般来说,只要jvm加载了class后,static修饰的变量就会放在栈当中,一般不会被jvm的GC回收。</p>
<p> </p>
<p>我说的“用static修饰的也一样”,指的是修饰的变量所指向的对象,是我没有表述清楚,造成了误会,实在是抱歉。</p>
<p> </p>
<p>就像你说的,栈存放的东西过多也会内存溢出,呵呵,不过我还没碰到过这样的事情。</p>
<p> </p>
<p>据说栈的速度比堆的速度快(貌似是算法决定的,堆比较灵活,但牺牲了速度;而栈刚好相反;是不是这样我不知道,没经过测试。),但貌似栈的内存空间比较小,所以如果放置了太多东西,就容易出现内存溢出。</p>
<p> </p>
<p>这些都是我看到的一些理论知识,没有经过试验,也不知道是否正确,还请各位指点。</p>
29 楼
moonese
2009-09-07
以前一直用 Yourkit JProfiler, 可以申请 Evaluation 的 License, 分析性能死锁问题的时候够用了。
现在一般的分析也会用 JDK 自带的 jvisualvm,还是能看到很多信息的,使用也很方便,而且免费,不用找xxx,呵呵。
现在一般的分析也会用 JDK 自带的 jvisualvm,还是能看到很多信息的,使用也很方便,而且免费,不用找xxx,呵呵。
vinter 写道
我一直在用JProfiler,感觉挺好用的,
发表评论
-
常见NIO开源框架(MINA、xSocket)学习 (转自javaeye博客)
2012-11-09 15:07 7402http://unbounder.iteye.com/blog ... -
解决 PermGen space Tomcat内存设置
2011-05-10 15:30 2078在操作一段时间就会出现 java.lang.OutOfMemo ... -
proxool 多数据源动态切换,刚刚一网友问我,顺便写的一个demo
2010-09-27 17:39 2227package aa; import java.io.F ... -
(转)sql批量执行效率对比
2010-05-24 18:10 3092环境: MySQL 5.1 RedHat L ... -
转自CSDN以作备份,使用java获取文档的编码格式
2010-05-24 09:57 1195package com.util.mail; import ... -
从bbs中看到的问题:从大量数据中取top100,整理的思路
2010-04-01 14:13 1488TreeSet算法很强悍,以后一定要记得使用 p ... -
Eclipse导出JavaDoc中文乱码问题解决
2010-03-09 10:38 969给 javadoc.exe 加上编码参数就OK。 ... -
搞懂java中的synchronized关键字
2009-12-18 14:38 962实际上,我关于java的基础知识的90%以上都来自Thinki ... -
JDialog 居中 方法二同样适合jFrame
2009-11-18 11:55 2776方法一调用JDialog的public void setLoc ... -
如果查询数据的时候报内存溢出咋办?
2009-10-30 10:45 1320前两天搞了个程序,需要一次性导出大量数据,在执行select的 ... -
手工将tomcat安装为服务及tomcat命令说明
2009-06-09 09:04 1729最近做了一个项目需要将tomcat和产品功能 ... -
Java 读取 INI 文件的示例
2009-05-19 18:15 1201package com.wfy.util; import ... -
java数据流压缩
2009-05-14 17:53 3565package com.wfy.util; import ... -
用java发送邮件
2009-05-13 13:33 1391<%@page contentType="te ... -
java窗口最小化到任务栏
2009-05-07 11:46 4109import java.awt.AWTException; ... -
Java 读/写文件文本文件的示例
2009-04-24 08:38 1058/* * 简单的读/写文本 ... -
java读写消息资源文件
2009-04-23 15:46 1634package com.lwf.util; import ... -
如果 点击子窗口父窗口也随之关闭 请看
2009-04-23 13:11 1874如果点击子窗口关闭按钮,父窗口也关闭了,可能是设置的问题 ... -
读取资源文件的N种方法- -
2009-04-23 09:37 1160如何读取资源文件:(一)Properties props = ... -
HTMLParser的使用
2009-03-11 17:32 1863一. 简介 htmlparser用于 对html页 ...
相关推荐
unix linux 堆栈 溢出 的 问题
JAVA内存溢出详解.docJAVA内存溢出详解.docJAVA内存溢出详解.docJAVA内存溢出详解.docJAVA内存溢出详解.docJAVA内存溢出详解.docJAVA内存溢出详解.docJAVA内存溢出详解.docJAVA内存溢出详解.docJAVA内存溢出详解.doc
堆和栈是两个不同的概念 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个...虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。
java内存泄露、溢出检查方法和工具。 步骤: 1,使用linux命令生存堆栈文件 2,用MemoryAnalyzer.exe工具打开 3,根据工具生成的饼状图可以清晰的找出内存泄漏源
堆栈溢出1
连接到我的堆栈溢出问题 - 这个项目是在 android 上测试 espresso。 没有“哈克”我就无法让它工作 为了使它工作,我必须注释这段代码: Espresso . onView( ViewMatchers . withId( R . id . email)) . perform( ...
stackoverflow-1134894 堆栈溢出问题“Maven2:企业项目的最佳实践(EAR 文件)”
【IT十八掌徐培成】Java基础第04天-04.OOP-堆栈的溢出与设置-private关键字.zip
当“最新的'java'问题-堆栈溢出”页面上出现新的问题时,此插件将通知您。它还会播放小声音。 例如,您正在看书,而无需每次都查看是否有新问题,因为如果有任何新问题,此插件将通知您。 目前仅适用于Windows操作...
最近因项目开发的需要,整理了一份用JAVA导出WORD文档,其部署步骤如下: 1、将jacob-1.14.3-x86.dll放在服务器的系统盘(或运行本机的系统):\WINDOWS\system32目录下。 2、将jacob-1.14.3-x86.dll放在JDK 的 bin ...
Java heap space 解决方法,解决tomcat堆栈溢出问题.
递归遍历指定目录所有的文件优化版本,自测无堆栈溢出,可直接拿来使用,如有问题,联系我
堆栈溢出好友 一个有用的终端应用程序,用于搜索堆栈溢出 这是什么? 这是一个Java Shell应用程序,可以轻松快速地从Stack Overflow获得答案。 它是从头开始设计的,因此我可以提高测试驱动开发(TDD),Java设计...
Scoold-JAR中的堆栈溢出 Scoold是一个用Java编写的问答基础知识平台。 该项目创建于2008年,2012年作为受Stack Overflow启发的学校社交网络发布。 在2017年,它进行了重构,重新包装和开源。 Scoold可以在任何地方...
内存溢出与数据库锁表的问题,可以说是开发人员的噩梦,一般的程序异常,总是可以知道在什么时候或是在什么操作步骤上出现了异常,而且根据堆栈信息也很容易定位到程序中是某处出现了问题。内存溢出与锁表则不然,...
飞机游戏java源码 问:如何在 vim 模式下启用 Sublime 3? {崇高} {vi} 在用户设置中,将 "ignored_packages": ["Vintage"] 更改为 ignore_packages": [] 问:Mac 上的 Sublime 不允许重复按键。 如何解决这个...
stackoverflow-28379562 堆栈溢出问题“@New 注释不起作用”
Belisarius-检测堆栈溢出时的故意破坏 背景 开发该机器人的目的是帮助捕获可能的破坏行为。 这包括: 删除所有代码 用废话代替所有内容 用重复的单词替换所有内容 为他们的问题添加解决方案,而不是发布答案 从他们...
34.java.lang.StackOverflowError 堆栈溢出错误。当一个应用递归调用的层次太深而导致堆栈溢出时抛出该错误。 35.java.lang.ThreadDeath 线程结束。当调用Thread类的stop方法时抛出该错误,用于指示线程结束。 36....
jca java dump分析工具,检测java 内存溢出,检测java 堆栈资源分析