jiiming 2020-01-08
传统C 或C++是程序员负责回收已分配的内存,也就是显示进行垃圾回收。因为程序员不知道内存应该何时释放,所以会导致一些分配出去的内存得不到回收,造成 ”内存泄漏“ 。导致系统运行速度下降,程序瘫痪。
一些分配出去的内存得不到回收,导致系统运行速度下降,甚至程序瘫痪的现象。
1)程序忘记及时回收无用内存,导致内存泄漏,降低系统性能
2)程序错误回收程序核心类库,导致系统崩溃
java程序的内存分配和回收都是由JRE在后台自动进行的,这种机制叫“垃圾回收机制,Garbage Collection,即GC。
JRE提供了一条超级线程进行检测和控制,一般都是在CPU空闲或内存不足时进行自动回收垃圾,因为程序员无法掌控垃圾回收时间和顺序。
java的堆内存是一个运行时数据区,用于 保存 “对象”,即类的实例。程序中的所有对象都是放在堆内存中的,一般堆内存是由垃圾回收机制负责的。垃圾回收是一种动态存储管理技术,它会自动释放 “不再被程序引用的对象”,按特定算法回收垃圾。
(1)当没有对象引用指向原先分配给某个对象的内存时,该内存就成了垃圾。也就是当一个对象不再被引用的时候,其内存空间就会被回收
(2)垃圾回收也可以清除内存记录碎片。由于创建对象和垃圾回收器释放丢弃对象所占的内存空间,内存会出现碎片。“碎片”指分配给对象的内存块之间的空闲内存区,碎片处理将占用的堆内存移到堆的一端,JVM将整理出的内存重新分配给新对象。
(1)提高编程效率。不需要程序员花时间处理内存垃圾。
(2)保护程序的完整性,是java安全性策略的一个重要部分。
垃圾回收影响程序性能。因为java虚拟机必须跟踪程序中有用的对象,从而确定哪些对象是需要 回收的,这样一来就会花费处理器一定的时间
(1)垃圾回收的目标是回收无用的对象的内存空间,这些内存空间是JVM中的内存空间,垃圾回收只能回收内存,对物理资源,如数据库连接、磁盘IO等资源无能为力。
(2)可以通过把引用对象的值设为null来暗示该对象为可回收对象
通过 对象.finalize( ) 或者 System.gc( ) 来进行垃圾回收