java的内存管理

来源:互联网 发布:单片机pwm控制程序 编辑:程序博客网 时间:2024/04/29 14:03

Java的垃圾回收机制

“c++程序员觉得内存管理太重要了,所以内存一定要自己进行管理;Java/C#程序员觉得内存管理太重要了,所以一定不要自己去管理。”

Java中使用被称为垃圾回收集器的技术来监视Java程序的运行,当对象不再使用时就会自动释放对象使用的内存。

Java中使用一些软指针来指向对象的引用。

Java的垃圾回收集能够以单独的线程在后台运行,并依次检查每个对象。

垃圾回收集是自动运行的,一般情况下,不需要显示调用。垃圾回收集会不时检查对象的使用。

Java垃圾回收集并不能完全阻止内存溢出情况。例如:当创建一个引用对象时,其他的引用对象没有被抛弃,也会造成内存溢出的情况。

Java垃圾回收并不是一个独立的平台,它具有平台依赖。

Java垃圾回收集:gc即垃圾回收集,是指JVM用于释放那些不再使用的对象所占的内存资源。

Java的垃圾回收机制是为所有的应用程序服务的,而不是为某个程序单独服务的。因此,任何一个程序都不能命令垃圾回收机制做什么,怎么做或做多少。

Java中提供一些和垃圾收集打交道的类,而且提供了一种强行执行垃圾收集的方法——调用System.gc(),但这同样是一个不确定的方法。Java中并不保证每次调用该方法就一定能启动垃圾收集,它只不过会向jvm发出这样的一个申请,到底是否真正的执行垃圾回收,一切都是个未知数。

Java中一般来说,如果没有特殊情况就使用jvm默认选项。增量收集器比较适用于实时性要求比较高的系统中;若系统具有较高的配置,有比较多的闲置资源,则可以考虑使用并行标记/清除收集器。

对于频繁调用内存和释放内存的操作还是自己管理内存,System.gc()并不一定管用,可以使用finalize强制执行,或自己编写finalize方法。

——————摘自书籍《Java程序员面试宝典

举例:

来自:http://blog.csdn.net/javayohn/article/details/3202064

程序段2:

  1.Object sobj = new Object ( ) ;

  2.Object sobj = null ;

  3.Object sobj = new Object ( ) ;

  4.sobj = new Object ( ) ;

  问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?

  答:第1行和第3行。因为第2行为sobj赋值为null,所以在此第1行的sobj符合垃圾收集器的收集标准。而第4行相当于为sobj赋值为null,所以在此第3行的sobj也符合垃圾收集器的收集标准。

  如果有一个对象的句柄a,且你把a作为某个构造器的参数,即 new Constructor ( a )的时候,即使你给a赋值为null,a也不符合垃圾收集器的收集标准。直到由上面构造器构造的新对象被赋空值时,a才可以被垃圾收集器收集。

  程序段3:

  1.Object aobj = new Object ( ) ;

  2.Object bobj = new Object ( ) ;

  3.Object cobj = new Object ( ) ;

  4.aobj = bobj;

  5.aobj = cobj;

  6.cobj = null;

  7.aobj = null;

  问:这段代码中,第几行的内存空间符合垃圾收集器的收集标准?

  答:第7行。注意这类题型是认证考试中可能遇到的最难题型了。

  行1-3分别创建了Object类的三个对象:aobj,bobj,cobj


  行4:此时对象aobj的句柄指向bobj,所以该行的执行不能使aobj符合垃圾收集器的收集标准。

  行5:此时对象aobj的句柄指向cobj,所以该行的执行不能使aobj符合垃圾收集器的收集标准。

  行6:此时仍没有任何一个对象符合垃圾收集器的收集标准。

  行7:对象cobj符合了垃圾收集器的收集标准,因为cobj的句柄指向单一的地址空间。在第6行的时候,cobj已经被赋值为null,但由cobj同时还指向了aobj(第5行),所以此时cobj并不符合垃圾收集器的收集标准。而在第7行,aobj所指向的地址空间也被赋予了空值null,这就说明了,由cobj所指向的地址空间已经被完全地赋予了空值。所以此时cobj最终符合了垃圾收集器的收集标准。 但对于aobj和bobj,仍然无法判断其是否符合收集标准。

  总之,在Java语言中,判断一块内存空间是否符合垃圾收集器收集标准的标准只有两个:

  1.给对象赋予了空值null,以下再没有调用过。

  2.给对象赋予了新值,既重新分配了内存空间。

  最后再次提醒一下,一块内存空间符合了垃圾收集器的收集标准,并不意味着这块内存空间就一定会被垃圾收集器收集。

举例:如果有一个对象的句柄a,且你把a作为某个构造器的参数,即 new Constructor(a),则即使你把a赋值为null,a也不符合垃圾收集器的收费标准。直到由上面的构造器构造新的对象杯赋空值时,a才可以被垃圾收集器收集




0 0
原创粉丝点击