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才可以被垃圾收集器收集。
- Java的内存管理
- java的内存管理
- java的内存管理
- java的内存管理
- Java的内存管理
- JAVA的内存管理
- Java的内存管理
- java的内存管理
- java的内存管理
- java的内存管理
- Java 的内存管理
- java的内存管理
- 初探JAVA的内存管理
- 研究一下Java的内存管理
- JAVA内存管理的技巧
- Java内存管理的技巧
- Java数组的内存管理
- java的内存管理实例
- 自定义控件之-TopBar
- Word2010如何编辑好了直接发布csdn博文?
- 13.C#:using用法详解
- JDK8新特性:使用Method References实现方法复用,简化lambda表达式
- Shell判断字符串包含关系的几种方法
- java的内存管理
- 二进制形式打印整数
- angular js 页面
- 线性规划与网络流24
- 远程局域网备份(全备份)
- CRFsuite 学习: CoNLL 2000 shared task
- spice下通道OpenSSL加密的过程和加密数据传输过程解密
- ffmpeg编程基础:视频编码、视频转码
- Git使用代理服务器