Java学习笔记之垃圾回收机制
2016-03-21 01:17
477 查看
Java不需要程序员直接控制回收内存(不同于C和C++),其内存分配和回收都是由JRE在后台自动进行的。JRE提供一个后台线程进行检测和控制,一般在CPU空闲或内存不足时自动进行垃圾回收,自动释放不再被程序引用的对象,按照特定的垃圾回收算法。但程序员无法精确控制垃圾回收的时间和顺序等。
优点:提高编程效率;保护程序完整性。
缺点:开销影响性能。虚拟机必须跟踪程序中有用的对象,才能确定哪些是无用的对象。
特点:
1、垃圾回收只能回收内存资源,对其他物理资源,比如数据库连接,磁盘I/O等无能为力。
2、为了更快让垃圾回收,可以对无用对象引用变量设为null,暗示虚拟机可回收。
3、垃圾回收不可预知。可能定时/空闲/极限都有可能。可以System.gc方法建议回收,但仍有不确定性。除非finalize方法。
更新:16-3-22
建议回收:System.gc()或Runtime.getRuntime.gc()
通知系统进行垃圾回收,但系统是否进行垃圾回收依然不确定,但大部分时候,总会有一些效果,不会说程序的建议完全置之不理。
当系统要进行垃圾回收时,会调用默认的finalize()方法。但何时被调用时不确定的,不一定会执行。另外,任何类都可以重写finalize()方法,所以如果里面包含试图将可恢复对象重新变成可达状态的功能时会出现对象重新变成可达状态。
如果需要强制执行finalize()方法,在执行gc方法后,加上System.runFinalization()或Runtime.getRuntime.runFinalization()即可。
另外一些概念:
强引用:最常见,处于可达状态(包括常量池),不可能被回收。
软引用:SoftReference可能被回收。当系统内存足够时,不会被回收,只有当不足时才可能回收它。
弱引用:WeakReference不论内存是否足够,只要等到垃圾回收机制运行,总会被回收。
虚引用:类似于没有引用,不能单独使用,主要用于跟踪对象被垃圾回收的状态。
优点:提高编程效率;保护程序完整性。
缺点:开销影响性能。虚拟机必须跟踪程序中有用的对象,才能确定哪些是无用的对象。
特点:
1、垃圾回收只能回收内存资源,对其他物理资源,比如数据库连接,磁盘I/O等无能为力。
2、为了更快让垃圾回收,可以对无用对象引用变量设为null,暗示虚拟机可回收。
3、垃圾回收不可预知。可能定时/空闲/极限都有可能。可以System.gc方法建议回收,但仍有不确定性。除非finalize方法。
更新:16-3-22
建议回收:System.gc()或Runtime.getRuntime.gc()
通知系统进行垃圾回收,但系统是否进行垃圾回收依然不确定,但大部分时候,总会有一些效果,不会说程序的建议完全置之不理。
当系统要进行垃圾回收时,会调用默认的finalize()方法。但何时被调用时不确定的,不一定会执行。另外,任何类都可以重写finalize()方法,所以如果里面包含试图将可恢复对象重新变成可达状态的功能时会出现对象重新变成可达状态。
如果需要强制执行finalize()方法,在执行gc方法后,加上System.runFinalization()或Runtime.getRuntime.runFinalization()即可。
另外一些概念:
强引用:最常见,处于可达状态(包括常量池),不可能被回收。
软引用:SoftReference可能被回收。当系统内存足够时,不会被回收,只有当不足时才可能回收它。
弱引用:WeakReference不论内存是否足够,只要等到垃圾回收机制运行,总会被回收。
虚引用:类似于没有引用,不能单独使用,主要用于跟踪对象被垃圾回收的状态。
相关文章推荐
- spring学习笔记(9)AOP基本概念
- springmvc mybatis 声明式事务管理回滚失效,(checked回滚)捕捉异常,传输错误信息
- 16 API-集合(List的子类(ArrayList_Vector_LinkedList,集合嵌套遍历),JDK5新特性(泛型,增强for循环,静态导入,可变参数)
- Java Lambda表达式入门
- 18. 4Sum | Java最短代码实现
- Spring中配置和读取多个Properties文件--转
- Spring MVC 与ExtJS完美集成
- 【未完】【java算法】迷宫求解
- Java 实现多线程的三种方式
- Java DB
- spring 处理clob,blog例子
- Double的精度问题
- Java异常处理机制(经典)
- Spring Boot定时任务的使用方法
- SpringBoot 定时任务遇到的坑
- Java线程同步(三)
- Spring 切面配置
- 获取form表单元素值的4种方式
- java反射创建带构造参数的类 并执行方法
- 圣思园-张龙-Java SE 第四讲(运算符 Operator)