Java GC 原理
2016-07-11 14:38
441 查看
内存的分配和释放,典型的做法有
1.全人工,也就是调用malloc/free,new/delete这些完全靠程序员,当然这样开发的程序很容易出现bug
2.引用计数,对每个分配的对象增加一个引用计数器,这样带来的问题是内存额外开销,增加减少引用时的计算开销,特别在多线程时的加锁,而且还有循环引用的问题。
3.标记清除,也就是Java GC采用的方式,通过判断有向图中每个节点是否能与根节点相通来对对象进行标记回收。这种方式通过一个独立的GC线程来判断对象在有向图中与根节点的可达状态,然后再进行清除。
Java GC的时机是由系统算法自身决定,或者说不可准确预测,即使是调用了System.gc().被释放的对象会根据大小,生成时间,程序内存使用情况等,触发不同的GC条件,进而用不同的GC方式(minor gc / full gc)释放。
1.全人工,也就是调用malloc/free,new/delete这些完全靠程序员,当然这样开发的程序很容易出现bug
2.引用计数,对每个分配的对象增加一个引用计数器,这样带来的问题是内存额外开销,增加减少引用时的计算开销,特别在多线程时的加锁,而且还有循环引用的问题。
3.标记清除,也就是Java GC采用的方式,通过判断有向图中每个节点是否能与根节点相通来对对象进行标记回收。这种方式通过一个独立的GC线程来判断对象在有向图中与根节点的可达状态,然后再进行清除。
Java GC的时机是由系统算法自身决定,或者说不可准确预测,即使是调用了System.gc().被释放的对象会根据大小,生成时间,程序内存使用情况等,触发不同的GC条件,进而用不同的GC方式(minor gc / full gc)释放。
相关文章推荐
- [改善Java代码]多线程使用Vector或HashTable
- 用JDK自带的包来解析XML文件(DOM+xpath)
- [改善Java代码]减少HashMap中元素的数量
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
- java二分法查找
- java自学篇之数组2
- [改善Java代码]使用shuffle打乱列表
- [改善Java代码]集合运算时使用更优雅的方式
- java自学篇之数组1
- Java基础——使用json所要用到的jar包下载
- [改善Java代码]集合中的元素必须做到compareTo和equals同步
- HeadFirstJava——8_接口与抽象类
- java接口的实现
- [改善Java代码]不推荐使用binarySearch对列表进行检索
- 深入剖析Java中的装箱和拆箱
- [改善Java代码]使用Comparator进行排序
- java多态的实现(二)
- 反射入门
- [改善Java代码]生成子列表后不要再操作原列表
- Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition