JAVA垃圾回收问题
1.垃圾收集是一种从无用对象收其所占用的内存,并使回收的内存能被再次使用的机制。
2.无用对象是值它不能被程序中处于活动状态的部分引用(个人理解就是没有引用指向该对象时)。
3.垃圾回收机制(gc)处于低优先级的线程内,当使用内存较少时运行,但不能保证何时运行
4.不可能强制运行垃圾回收线程,但是调用语句System.gc()有可能激活垃圾收集程序。
5.在垃圾回收机制中无法保证对象被垃圾回收的顺序,也无法保证finalize()的方法被调用的顺序。
6.环形引用并不能阻止对象被回收,例:
class A
{
B b;
}
class B
{
A a;
}
执行下面的程序:
A a=new A();
B b=new B();
a.b=b;
b.a=a;
最后,这两个对象都会被回收。
7.我们可以设置引用变量值为null,来暗示垃圾收集线程来回收此引用的对象所占用的内存。如果该对象属于某监听器对象,那么,应该首先将这个监听器注销掉,否则该对象可能依然不能被垃圾回收。
8.所有对象都有一个finalize()方法,他是从object继承下来的,注意j2me中不可用。
9什么情况下垃圾回收线程会启动?一般规则是:当存在没用对象时,将启动垃圾回收线程,队伍用对象占用的内存进行释放。什么是无用对象呢?一般规则是:没有引用指向的对象成为无用对象。
10:垃圾回收线程的启动时间由jvm内嵌算法来进行调度,程序员无法直接调用它,它的运行只有两种情况:系统在运行过程中处于空闲状态和内存资源使用不足。
11.无用对象判断方法补充:沿着对象的引用的被包含关系追溯不到跟对象或活动线程时,则这个对象被称为无用对象。
如下面所示,对象a、b、c、d、e不是无用对象,而g、h是无用对象,其中main代表跟对象
main |
A |
C |
D |
B |
E |
G |
H 12.垃圾回收线程管理的内存区域:在java语言中,内存的分配与其他的语言也是一样的,分为代码区、堆区、栈区、数据区,垃圾回收能够管理的内存区域仅限于堆区,在类中声明的静态数据内存分配在数据区,因此,静态数据不会被垃圾回收线程回收。 |