- 浏览: 20848 次
- 性别:
- 来自: 杭州
最新评论
-
yaofeng928:
对Initial Mark、Concurrent Mark和R ...
J2SE 5.0的HotSpot JVM上的GC学习 - CMS GC
文章列表
本博客现在会顶置一个帖子,介绍一些非常好的网站,也欢迎大家推荐更多的好的网站。
GoldenDoc 黄金档 。这是我所在的团队博客,有关技术,开源,对一些基础技术的研究是比较深入的。打好基础,才是最最重要的。下面是关于黄金档的资料:
Golden Doc写道
goldendoc,致力于对开源框架的分析和研究。对于程序员来说,我们生活在一个框架的世界里。每一个框架对于程序员来说都是一笔宝贵的财富,因为框架不仅为我们提供了我们需要的功能,更重要的,它也是优秀的程序员思想和代码的结晶。在框架里,你可以学到很多,比如设计模式、如何重构代码、还有对于程序员来说不可多 ...
以下是在学习 http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf
之后所做的学习笔记。
请大家看后多拍砖,多交流
GC学习笔记,在下文中,GC即作为动词,又可作为名词:)
GC特性以及各种GC的选择
GC性能指标
分代回收
J2SE 5.0的HotSpot JVM上的GC学习 - 分代、GC类型、快速分配
J2SE 5.0的HotSpot JVM上的GC学习 - SerialGC
J2SE 5.0的HotSpot ...
之前简单的看了一下 Tokyo Tyrant(包括 Tokyo Cabint) 在 hash 存储上的一些实现,最近 Redis 又比较火热,因此,自己也尝试性的去了解了一下 Redis,并且结合 Tokyo Tyrant(以下简称 tt server),说说自己对这两种产品的看法。抛砖引 ...
Concurrent mark sweep GC
很多应用对响应时间的要求要大于吞吐量。
YGC并不暂停多少时间,但FGC对时间的暂用还是很长的。特别是在年老区使用的空间较多时。
因此, HotSpot引入了一个叫做CMS的收集器,也叫低延时收集器。
CMS的YGC
与并行GC同样的方式: stop-the-world 加上 copy。
CMS的FGC
CMS的FGC在大部分是和应用程序一起并发的!
CMS在FGC的时候,一开始需要做一个短暂的暂停,这个阶段称为最初标记:识别所有被引用的对象。
在并发标记时候,会和应用程序一起运行。
因为并发标记是和程序一 ...
Parallel Compacting GC
parallelCompactingGC是在J2SE5.0 update6 引入的。
parallel compacting GC 与 parallel GC的不同地方,是在年老区的收集使用了一个新的算法。并且以后,parallel compacting GC 会取代 parallem GC的。
YGC的并行压缩GC
与并行GC使用的算法一样:stop-the-world 和 复制。
年老区的并行压缩GC
他将把年老区和永久区从逻辑上划分成等大的区域。
分为三个阶段:
标记阶段,使用多线程对存在引用的对象进行并行标记 ...
并行GC
现在已经有很多java应用跑在多核的机器上了。
并行的GC,也称作吞吐量GC,这种GC把多个CPU都用上了,不让CPU再空转。
YGC的并行GC
YGC的情况,还是使用stop-the-world + 复制算法的GC。
只不过是不再串行,而是充分利用多个CPU,减少GC负荷,增加吞吐量。
如下图,串行YGC和并行YGC的比较:
年老区的并行GC
也是和串行GC一样,在年老区和永久区使用Mark-Sweep-Compact,利用多核增加了吞吐量和减少GC负荷。
何时使用并行GC
对跑在多核的机器上,并且对暂停时间要求不严格的应用。因为频率较低, ...
串行GC
串行GC,只使用单个CPU,并且会stop the world。
young 的串行GC
如下图:
当发生ygc的时候,Eden和From的survivor区会将被引用的对象复制到To这个survivor种。
如果有些对象在To survivor放不下,则直接升级到年老区。
当YGC完成后,内存情况如下图:
old区的串行GC
年老区和永久区使用的是Mark-Sweep-Compact的算法。
mark阶段是对有引用的对象进行标识
sweep是对垃圾进行清理
compact对把活着的对象进行迁移,解决内存碎片的问题
如下图:
...
HotSpot上的分代
分成三部分:年轻代、年老代、永久代
很多的对象一开始是分配在年轻代的,这些对象在熬过了一定次数的young gc之后,就进入了年老代。同时,一些比较大的对象,一开始就可能被直接分配到年老代中(因为年轻代比较小嘛)。
年轻代
年轻代也进行划分,划分成:一个Eden和两个survivor。如下图:
大部分的对象被直接分配到年轻代的eden区(之前已经提到了是,很大的对象会被直接分配到年老代中),
survivor区里面放至少熬过一个YGC的对象,在survivor里面的对象,才有机会被考虑提升到年老代中。
同一时刻,两个survivor ...
之前
Btrace
只是听说过,但还没有具体的用到。最近在排查线上问题的时候,使用了
Btrace
,发现
Btrace
真是在关键时候的利器。
Btrace
是一个安全,可以动态跟踪
java
程序的一种工具。
他的操作不会对原有
java
进程产生影响,不用关闭正在运行的
java
进程,也不会修改
java
进程中的逻辑和数据。
因此,也就成为我们线上跟踪生产代码的有力工具!
Btrace
的脚本编写也非常简单:和写
Java
代码一样的,因此对于我们,学习的曲线几乎是平坦的。
下面就分享一下
...
什么是分代
当使用分代回收技术,内存会被分为几个代(generation)。也就是说,按照对象存活的年龄,把对象放到不同的代中。
使用最广泛的代,应属年轻代和年老代了。
根据各种GC算法的特征,可以相应的被应用到不同的代中。
研究发现:
大部分的对象在分配后不久,就不被引用了。也就是,他们在很早就挂了。
只有很少的对象熬过来了。
年轻代的GC相当的频繁,高效率并且快。因为年轻代通常比较小,并且很多对象都是不被引用的。
如果年轻代的对象熬过来了,那么就晋级到年老代中了。如图:
通常年老代要比年轻代大,而且增长也比较慢。所以GC在年老代发生的频率非常低,不过一 ...
吞吐量
应用花在非GC上的时间百分比
GC负荷
与吞吐量相反,指应用花在GC上的时间百分比
暂停时间
应用花在GC stop-the-world 的时间
GC频率
顾名思义
Footprint
一些资源大小的测量,比如堆的大小
反应速度
从一个对象变成垃圾道这个对象被回收的时间
一个交互式的应用要求暂停时间越少越好,然而,一个非交互性的应用,当然是希望GC负荷越低越好。
一个实时系统对暂停时间和GC负荷的要求,都是越低越好。
一个嵌入式系统当然希望Footprint越小越好。
垃圾回收器的特性
该回收的对象一定要回收,不该回收的对象一定不能回收
一定要有效,并且要快!尽可能少的暂停应用的运行
需要在时间,空间,回收频率这三个要素中平衡
内存碎片的问题(一种解决内存碎片的方法, ...
背景
这几天在做开发联调的时候,出现了这样一种情况:我的应用本身开启的是24100端口,但别的应用却是调用我的80的端口。
本来我把端口重新配置一下,编译重启应用就OK的事情。但想想UED还在用我的24100端口,真是个棘手的事情。
由于时间紧急,所以就弄了一个最简单的方案:把 httpd 停掉,在配置文件中新增一个80端口的监听,重启 httpd。
事后想想,看有没有别的方法解决此问题,后来想了想,还有两种解决方案:
再新启一个httpd,监听80端口,并且在80端口做一个代理
使用 iptables 把端口从80 透明的改成 24100
由于第二种方案从来没有试 ...