一: 内存泄露与内存溢出的区别
1:内存泄露是指程序在运行时不断的创建新的对象,并且始终保持这些对象在引用状态,使GC无法回收这些对象,
资源得不到释放,当对象的数量达到堆的最大值时,就会出现内存泄露异常
2:内存溢出是指程序所使用的内存值达到了JVM所能的申请的最大的内存值。
二:
Java的线程是映射到系统内核线程上的,过多地创建线程会使内存使用较高,可能会导致操作系统假死现象。
三:运行时常量池溢出,会报OutOFMemeryError: PermGen Space(永久保存区域溢出,说明运行时常量池属于方法区)
JVM的GC在回收对象时是按照引用机制回收对象的,当对象还存在引用值时是不会回收对象的。但此种情况也存在特殊,
例如在List集合中,当把集合中的成员的引用滞空时是不能释放空间的,因为整个集合的引用并没有滞空,所以GC是不能
回收释放空间的。同样的情况适用于数组。
四:Java和C#判断对象是否存在并不是采用引用计算法,而是采用根搜索法。
引用计算法:给创建的对象增加一个引用计算器,每当增加一个引用时,计算器+1,每当一个引用失效时,计算器-1,当计算器
为0时, 判断这个对象是可以被回收的。
根搜索法:通过一系列名为”GC ROOTS“的对象做为起始点,从起始点开始向下搜索,走过的路径称为引用连,当一个对象到达”GC ROOTS“没有任何
引用连时,则改对象是不可达到的。
1:内存泄露是指程序在运行时不断的创建新的对象,并且始终保持这些对象在引用状态,使GC无法回收这些对象,
资源得不到释放,当对象的数量达到堆的最大值时,就会出现内存泄露异常
2:内存溢出是指程序所使用的内存值达到了JVM所能的申请的最大的内存值。
二:
Java的线程是映射到系统内核线程上的,过多地创建线程会使内存使用较高,可能会导致操作系统假死现象。
三:运行时常量池溢出,会报OutOFMemeryError: PermGen Space(永久保存区域溢出,说明运行时常量池属于方法区)
JVM的GC在回收对象时是按照引用机制回收对象的,当对象还存在引用值时是不会回收对象的。但此种情况也存在特殊,
例如在List集合中,当把集合中的成员的引用滞空时是不能释放空间的,因为整个集合的引用并没有滞空,所以GC是不能
回收释放空间的。同样的情况适用于数组。
四:Java和C#判断对象是否存在并不是采用引用计算法,而是采用根搜索法。
引用计算法:给创建的对象增加一个引用计算器,每当增加一个引用时,计算器+1,每当一个引用失效时,计算器-1,当计算器
为0时, 判断这个对象是可以被回收的。
根搜索法:通过一系列名为”GC ROOTS“的对象做为起始点,从起始点开始向下搜索,走过的路径称为引用连,当一个对象到达”GC ROOTS“没有任何
引用连时,则改对象是不可达到的。