- 浏览: 108538 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (75)
- JVM (22)
- 数据结构 (11)
- java 基础 (16)
- gc (6)
- jmock (1)
- Google (2)
- MapReduce (1)
- Memory (2)
- 算法 (2)
- cglib (1)
- jdk (3)
- 虚拟机 (3)
- 安全 (2)
- 多线程 (1)
- 工作 (1)
- 生活 (1)
- MongoDB (2)
- Hadoop (4)
- HDFS (2)
- cms (2)
- Spring (1)
- 网络协议 (1)
- GitHub (1)
- MYSQL 调优和使用必读(转) (1)
- 分布式 (2)
- Big Data (0)
- 技术Blog (1)
- Hbase (2)
- Zookeeper (1)
- paper (0)
最新评论
-
lzc_java:
Java线程安全兼谈DCL -
select*from爱:
it's nice
IT业薪水大揭秘
转载自 ---- http://zhangjiangxing-gmail-com.iteye.com/blog/1048832
1.为什么要使用垃圾收集?
字面是说是“垃圾收集”,更精确点就是“内存回收”,在一个对象不再被程序引用时,它所占用的堆空间就可以回收,以便分配给新对象使用。而且除了释放不再被引用的对象外,垃
圾收集器还要处理堆碎块(堆碎块是在正常的程序运行时产生的),因为新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活对的对象之间,而请求分配新对象时可能不得不增大堆空间,因为虽然总的空闲空间是够的,但堆中没有连续的空闲空间放得下新对象。
上面是垃圾收集的作用,其好处在于:1)提高了工作效率,在一个没有垃圾收集机制的语言下编程,程序员还要花时间来解决难以捉摸的内存问题 ;
2)帮助程序保持完整性,因为程序员不可能因为失误错误地释放内存而导致jvm崩溃 ;
2.垃圾收集器怎么知道对象不再被引用?
垃圾检测通常是通过建立一个根对象的集合并且检查从这些根对象开始的可触及性来实现。可触及就是正在执行的程序可以访问到的根对象和某个对象之间存在引用路径。
区分活动对象和垃圾的两个基本方法是引用计数 和 跟踪。
3.引用计数收集器是怎么判定对象为垃圾的?
引用计数的原理是:堆中第一个对象都有一个引用计数,当有一个对象被创建时,这个对象的引用计数被置为1。当有其他变量被赋值为这个对象的引用时,计数加1;当这个对象的引用超过了生存期或被设置为新的值,计数减1;当计数为0时,对象被认为是垃圾,将被回收;
这种方法的早已过时,主要缺陷是:他无法检测出循环引用 (即两个或多个对象互相引用),例如:父对象有一个对子对象的引用,子对象又反过来引用父对象,这时计数永远不可能为0。
4.跟踪收集器又是怎么一回事?
跟踪就是对对象设置标记,通过一 个从根结点开始的对象引用图追踪对象,在这个过程中对遇到的对象打上标记,当追踪结束时没有被打上标记的就是无法触及的,从而可以被回收。
5.怎么处理堆碎块?
一般处理堆碎块有以下几种收集器:
1.压缩收集器 : 把活动的对象都推到堆的一端,从而使另一端出瑞一个大的连续空闲区,所有被移动的对象的引用也被更新,指向新的位置;为了简便,更新被移动的对象引用时通 过一个间接引用层,因为不直接引用堆中的对象而对象的引用实际上指向一个对象句柄表的话不用改变引用指向的位置,但损失了部分性能。
2.拷贝收集器 : 把所有的活动的对象移动到一个新的区域,在这个过程中,活动对象被紧挨着布置从而消除原本它们在旧区域的空隙。一般的拷贝收集算法是——停止并拷贝,在这 个方法中堆被分为两个区域,任何时候都只使用其的一个区域。对象在同一个区域分配,直到这个区域满了为止;这时程序中止,堆被遍历,遍历到的活动对象被拷 贝到另外一个区域,完成后程序继续执行,如此循环;这种方法的代价是:对于指定大小的堆来说需两倍大小的内存。
下图是“停止并拷贝”算法的垃圾收集堆的图形描述:第一张图中,堆的下半部分没 有被使用,上半部分被对象零散的填充;2图是上半部分逐渐被填充,3图中上半部分被填满,这时程序中止,垃圾收集器开始工作,从根结点开始追踪活动对象 图,当遇到活动对象时就拷贝到堆的下半部分,每一个都紧挨着,如4图;如此打循环:
3.按代收集的收集器 :
简单的停止拷贝收集器的缺点在于:第一次收集,所有的活动对象都要被拷贝,而程序中一般都有以下特点:
1)大多数程序创建的大部分对象都具有很短的生命期;
2)大多数程序都创建一些具有非常长生命周期的对象;
简 单的停止拷贝收集器每次都把那些生命周期长的对象来回拷,浪费了时间;按代收集器通过把对象按照寿命来分组,更多的收集那些年幼的对象,当一个年幼对象经 过几次收集后仍然存活,那就将它提升为寿命更高的一代,从而对这个对象的收集频率就减少了,帮命越长的收集频率就越小;
4.自适应收集器 :看这个收集器的名字,顾名思义:根据不同的情况选择不同的垃圾收集技术;
6.什么是火车算法 ?
由于垃圾收集时一般会停止程序,如果停止的时间长得让用户注意到而不满意,那就说明这种算法存在破坏性,为了减少这种破坏性而采用渐进式收集算法(每次回收一部分),通常渐进式收集器都是按代收集器,而火车算法就是为了在成熟空间 空间 (最高寿的那个年龄层)提供限定时间的渐进收集。
火车算法把成熟对象空间划分为固定长度的内存块,算法每次在一个块中单独执行,每一个块属于一个集合,块就是“车厢”,集合就是“火车”,成熟对象空间就是“火车站”;就如车厢一样,块在一个集合中有序的;集合也被排序,就像火车站中的火车按轨道排列一样,如下图:
对象从更年轻的年龄层的子堆中进入成熟对象空间都会被附加到任何已存在的火车中或者为他们专门创建一列或多列火车。
每一次执行火车算法的时候,它不是收集最小数字的火车中的最小数字车 厢,就是收集整列最小数字的火车,算法首先检查指向最小数字火车中任何车厢的引用,如果不存在任何来自最小数字火车以外的引用指向它内部包含的对象,那么 整个火车都是垃圾,回收整个火车;如果不都是垃圾,那么将注意力放在火车中最小数字车厢上,首先把所有被最小数字车厢外部的车厢引用的对象转移到其他车厢 去,之后任何保留在车厢内的对象都是没有引用的,可以被回收;
而保证整列火车中没有循环的数据结构的关键是算法如何移动对象:
1)如果对象被成熟对象空间的其他火车引用,对象不被转移到引用它的那列火车中去;
2)然后转移过后的对象被扫描,查找对原车厢的引用,发现的任何被外用的对象都被转移到引用它的火车中去;
3)新被转移的对象也被扫描,这个过程不断重复,直到没有任何来自其他火车的引用指向正被收集的车厢;
4)如果接收对象的火车没有空间了,那么算法会创建新的车厢,并附加到那列火车的尾部;
7.终结
java中一个对象可以拥有终结方法:这个方法是垃圾收集器在释放对象前必须运行的。这个方法使垃圾收集器要做的工作更加复杂,因为垃圾收集器必须检查它所发现的不再被引用的对象是否存在终结方法——finalize();还得记住一点:是垃圾收集器运行对象的终结方法。
8.GC中对象的 六种可触及状态
1.强可触及:对象可以从根结点不通过任何引用对象搜索到
2.软可触及:对象不是强可触及的,但是可以从根结点开始通过一个或多个(未被清除的)软引用对象触及
3.弱可触及:对象既不是强可触及也不是软可触及的,但是从根结点开始可以通过一个或多个弱引用对象触及
4.可复活的:对象既不是强可触及、软可触及,也不是弱可触及,但是仍然可能通过执行某些终结方法复活到这几种状态之一
5.影子可触及:不上以上任何可触及状态,也不能通过终结方法复活,并且它可以从根结点开始通过一个或多个影子引用对象触及(影子引用不会被垃圾收集器清除,由程序明确地清除 )
6不可触及:就是已经准备回收的状态
发表评论
-
JVM优化之压缩普通对象指针(CompressedOops)
2013-05-03 11:01 1253通常64位JVM消耗的内存 ... -
JVM优化之调整大内存分页(LargePage)
2013-05-03 10:58 1190转载自 ---- http://kenwublog ... -
JVM优化之逃逸分析(Escape Analysis)
2013-05-03 10:56 1073转载自 ---- http://kenwublog ... -
Java基础 之软引用、弱引用、虚引用 ·[转载]
2012-06-07 18:13 11371、概述 在JDK1.2以前的版本中,当一个对象不 ... -
Java中常用的加密方法(JDK)
2012-03-30 16:35 10925转载自 ---- http://www.iteye.co ... -
java的内存管理
2012-03-29 16:59 1597转载自 ---- http://yangzhiyong77 ... -
java虚拟机常用命令工具(转载)
2012-01-31 16:40 6686转载自 ---- http://learnworld.itey ... -
虚拟机中的锁优化简介(适应性自旋/锁粗化/锁削除/轻量级锁/偏向锁)
2011-10-10 18:07 2166转载自 ---- http://www.iteye.com/t ... -
Java栈与堆
2011-10-10 16:39 861转载自 ---- http://mylir.i ... -
Java内存泄露的理解与解决
2011-10-10 16:38 960转载自 ---- http://henryyang.itey ... -
深入Java,初探JVM
2011-08-23 17:23 815转载自 ---- http://lrysir ... -
深入理解JVM
2011-08-22 18:18 882转载自 ---- http://yanle ... -
CMS gc实践调整(续2)
2011-08-19 12:10 1361转载自 ---- http://www.blogj ... -
CMS gc调整实践(续)
2011-08-19 12:09 1223转载自 ---- http://www.blogjava ... -
JVM问题诊断常用命令:jinfo,jmap,jstack
2011-08-18 11:19 1554转载自 ---- http://singleant.iteye ... -
Java HotSpot 性能引擎架构
2011-08-17 17:04 1035转载自 ---- http://lifethink ... -
Java线程安全兼谈DCL
2011-08-17 17:02 1538转载自 ---- http://www.iteye.com/t ... -
用happen-before规则重新审视DCL
2011-08-17 17:00 819转载自 ---- http://lifethink ... -
CMS gc实践总结(转载)
2011-08-10 15:09 1066首先感谢阿宝 同学的帮助,我才对这个gc算法的调整有 ... -
jvm优化参数整理
2011-08-10 14:47 1417转载自 ---- http://agapple.ite ...
相关推荐
本文将对Java垃圾回收进行小结,探讨其基本原理、类型以及常见算法。 1. 基本原理: Java中的内存分为堆(Heap)和栈(Stack)两部分,垃圾回收主要关注堆内存。当一个对象不再被任何引用指向时,它被视为可回收的...
**3.1.3 小结** 动态代理的主要优点在于其灵活性,能够轻松地为任何实现了接口的类添加额外的行为。但需要注意的是,只有实现了接口的类才能使用动态代理。 ##### 3.2 动态字节码生成 动态字节码生成技术允许在...
Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。...这只是Java J2SE和J2EE学习中的一小部分,要成为一名出色的Java开发者,还需要不断深入学习和实践,掌握更多的高级特性、框架和最佳实践。
### Java基础知识小结 #### 1.1 `getPath()`、`getAbsolutePath()`、`getCanonicalPath()`的区别 在Java中,处理文件路径时经常会用到`getPath()`、`getAbsolutePath()`以及`getCanonicalPath()`这三个方法。它们...
在“day09【常用API、引用类型小结】”的学习中,我们可能会涉及到以下关键知识点: 1. **常用API**:这部分可能涵盖各种常用库,例如Java的`java.util`包,其中包含集合框架(如ArrayList、HashMap)、日期时间...
1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...
### 小结 Flash Player作为一款历史悠久且广泛应用的技术,在其背后隐藏着复杂的内部机制。从核心周期到用户代码处理器,再到AVM2的具体实现,每个环节都体现了设计者们对性能与安全性的平衡考量。通过理解这些机制...
1.10 小结 第2章 /CP协议 2.1 概述 2.2 /CP中的新CP选项 2.3 /CP实现所需变量 2.4 状态变迁图 2.5 /CP的扩展状态 2.6 小结 第3章 /CP使用举例 3.1 概述 3.2 客户重新启动 3.3 常规的/CP事务 3.4 服务器收到过时的...
1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 ...
1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 ...
1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 ...
1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 ...
1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 ...
1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 ...
1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 ...
1.10 小结 21 第2章 T/TCP协议 23 2.1 概述 23 2.2 T/TCP中的新TCP选项 23 2.3 T/TCP实现所需变量 25 2.4 状态变迁图 27 2.5 T/TCP的扩展状态 28 2.6 小结 30 第3章 T/TCP使用举例 31 3.1 概述 31 3.2 客户重新启动 ...
1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...
1.10 小结 第2章 T/TCP协议 2.1 概述 2.2 T/TCP中的新TCP选项 2.3 T/TCP实现所需变量 2.4 状态变迁图 2.5 T/TCP的扩展状态 2.6 小结 第3章 T/TCP使用举例 3.1 概述 3.2 客户重新启动 3.3 常规的T/TCP事务 3.4 服务器...
1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...