内存泄露:不被使用的有reference的对象。 在java中,gc机制有n个区,它们共享着jvm的256m内存(这个值可以设) 新建的对象在新对象区中, 过一定时间后被转移到old area. (如果新对象区超过自身75%时,也会进行转移) old area 也细分了几个区,当gc机制启动时,old area的某些对象就被清除,释放内存(具体的就不说了,来看看如何造成内存泄露的)gc时,会去old area中查看哪些对象没有reference,找到一个,绝不留情的释放。 所以,old area中的有reference的对象超过了一定量(比如256m),那就...(另注:不同的vm的gc参数不太一样,但都可以设,例大小,百分比,响应时间)
Java的GC采用有向图的方法来进行垃圾回收, main可以看做这个有向图的根节点, 如果从根节点可达的对象为有效对象, 否则为无用对象. 那么什么是内存泄漏呢, 当这个对象已经为无用对象(程序不再使用),但又能够从根节点可达,那么这个对象就无法被GC回收,对服务程序来说就会内存占用越来越多. 下面举个程序例子 List list = new ArrayList(); for (int i = 0; i < 100; i++) { Object o = new Object(); list.add(o); o = null; } 那么o已经被置成null,但list又包含其引用, 使其不能被释放.
在一个长生命周期的对象里使用一个短生命周期的对象,gc 能够回收这个短寿命的对象吗?比如一个singleton 对象里组合了一些对象?
在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是可达的,即在有向图中,存在通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。
在java中,gc机制有n个区,它们共享着jvm的256m内存(这个值可以设)
新建的对象在新对象区中, 过一定时间后被转移到old area.
(如果新对象区超过自身75%时,也会进行转移)
old area 也细分了几个区,当gc机制启动时,old area的某些对象就被清除,释放内存(具体的就不说了,来看看如何造成内存泄露的)gc时,会去old area中查看哪些对象没有reference,找到一个,绝不留情的释放。
所以,old area中的有reference的对象超过了一定量(比如256m),那就...(另注:不同的vm的gc参数不太一样,但都可以设,例大小,百分比,响应时间)
下面举个程序例子
List list = new ArrayList();
for (int i = 0; i < 100; i++)
{
Object o = new Object();
list.add(o);
o = null;
}
那么o已经被置成null,但list又包含其引用, 使其不能被释放.
6楼的说法不完全,当你的程序内存占用了超过最大内存限制也会抛出OutOfMemoryException, 如:你将一个1G的文件装载到内存中, 而jvm配置的最大内存限制为512M.
jni可以会,比如在swt中
线程死锁无法正常关闭