首页 > 技术文章 > java垃圾回收

thly1990 2014-02-23 11:10 原文

jvm何时回收一个java对象所占的内存?

当java对象失去引用时,JVM垃圾回收机制会清除他们,回收所占内存空间。

java有没有内存泄漏?

无用的内存没有被回收就是内存泄漏。

C++内存泄漏:内存是由程序员显示回收,忘了回收会导致内存泄漏

java内存泄漏:不可达对象由jvm回收不会导致内存泄漏,可达的但程序员不使用的对象会导致内存泄漏,其实就是浪费内存,占着空间自己又不用。

数组的remove

element[--size]=null删除元素要把引用赋值为null,否则就内存泄漏

自定义stack的pop

elementData[size]=null同样的道理

jvm回收java对象内存细节

垃圾回收的任务:跟踪并监控每个java对象,当不可达,回收内存;清理内存分配的时候产生的内存碎片。

垃圾回收算法:

执行方式:

(1)串行执行和并行执行

(2)并发执行和应用程序停止

回收内存方式:(目的是回收不可达对象)

(1)复制:搜索全部A可达对象,然后直接全部复制到B,再把A回收

(2)标记清除:扫描一遍标记A那些可达的,再扫描一遍回收那些不可达的

(3)标记压缩:扫描一遍标记A那些可达的,再压缩把可达对象凑一块,然后再一起回收不可达的。

引用分类

(1)强引用:处于可达状态,不可能回收;

(2)软引用:SoftReference当系统空间不足时,有可能被回收

(3)弱引用:WeakReference生命期更短,更弱

(4)虚引用:PhantomReference不能单独使用,用于跟踪对象被垃圾回收的状态

 

隔代回收机制

young代:复制算法遍历处于可达的对象,对象少,复制成本不大。

old代:young代多次扫描后留下的移动到old代,采用标记压缩算法

permanent代:不会被回收,用于装载class类信息(个人理解就是栈空间outofMermeryError: Perm Gen space)

 

垃圾回收附加选项

-Xmx:设置jvm堆内存最大容量

-Xms:设置jvm堆内存初始容量

-XX:PermSize:设置Permanent代默认容量

-XX:MaxPermSize:设置Permanent代最大容量

 

内存管理技巧

(1)尽量使用直接量

(2)使用StringBuilder和StringBuffer进行字符串连接

(3)尽早释放无用对象的引用

(4)尽早释放静态变量

(5)避免在经常调用的方法和循环中创建java对象

(6)缓存经常使用的对象

(7)尽量不要使用finalize方法

(8)考虑使用SoftReference

 

 

 

推荐阅读