论坛首页 Java企业应用论坛

java的内存泄露问题

浏览 8731 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-27  
peacockbird 写道
或者说我们什么时候去消除对象的过期引用?

因为函数内的局部变量出函数就会丢失引用,所以,只有类的成员变量是可能被长期持有的。

静态成员变量,类初始化的时候,静态成员就会被创建,直到程序结束,所以可能会造成内存泄漏。特别是集合,数组类的成员变量
实例的成员变量,如果某个实例,生命周期贯穿整个程序,那么这个实例的成员变量也可能造成内存泄漏。

其他情况下可能由于内存使用很糟糕造成内存溢出,不过如果能够增加jvm虚拟内存让程序运行过去,那么内存会被GC释放不会造成泄漏。
0 请登录后投票
   发表时间:2007-09-27  
非常感谢各位的帮助
0 请登录后投票
   发表时间:2007-09-27  
听说,Java中有一个弱引用类的哦~!

那么也就是说,即使外界没有任何引用指向堆内存对象时,GC自身也会有一个弱引用指向这些对象。本来Java 中的引用就是C++中的指针,如果GC本身没有弱引用的话,怎么知道那些内存算是垃圾内存呢?就像C++中的delete()方法一样,需要一个指针变量作为参数。

说老实话,虽然垃圾回收可以让程序员变得更懒惰,但是我个人真的很讨厌它的。因为不知道什么时候才能释放掉你可能马上就想利用的内存。

0 请登录后投票
   发表时间:2007-09-27  
所谓弱引用,就是雇个机器人自动去断开钩子而已~~它可不是狗实现的....

GC的实现方法。建议楼上的去查查资料。搞清楚了你估计就会改变对GC的看法。
0 请登录后投票
   发表时间:2007-09-27  
realorg 写道
怎么知道那些内存算是垃圾内存呢?

对象是从main函数开始创建的,所有对象之间的关系会形成一张图,不在图里的就是再也用不到的垃圾了。

0 请登录后投票
   发表时间:2007-09-27  
peacockbird 写道
呵呵,谢谢。但是我有个疑问jvm是怎么知道什么时候这些引用是我们自己在管理的?

有一种jvm他是这样找的(忘记哪种了,汗一个),他会在gc发生的时候便利所有栈上的引用,只要有引用的,他就顺藤摸瓜,摸下去,如果是对象就便利对象的引用,摸呀摸呀,只要被他摸到的,都是安全的,都不会被删除。而且清理的时候也有两种情况,一种是较小的内存释放,就直接释放了,另一种是较多的释放,他会拷贝内存到另一个连续的区域,因为java 的new方法分配的内存是连续的,这也是为啥比c++的new快的原因。
大体上就这样,具体jvm实现不同。
0 请登录后投票
   发表时间:2008-07-28  
jvm只负责管理对象,可不负责管理引用,你不把它设置成null,你自己知道这个我不用了,别人可不知道这个你不用了,null等于你告诉他“不用”的一个信号
0 请登录后投票
论坛首页 Java企业应用版

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