垃圾回收器是垃圾回收算法的实现,Java虚拟机的设计者为了

获取最大的性价比,也在不断改进中。硬件在不断变化,多核

的普及,基于单核的收集器应该已经没有太大意义了。Java7中

又新增了g1收集器,没具体研究,【不明觉厉】啊。

暂时觉得垃圾器的细节不用深入研究,性能问题卡到垃圾收集,应该

考虑的是编写的程序质量而不是垃圾回收的性能。

下面介绍垃圾回收的一些原则:

(1) 对象先在eden上分配。

如果eden上剩余空间无法容纳新建立的

对象,则发起一次新生代的垃圾回收。过程是把eden和survivor from

上存活的对象放入survivor to上,之后清理eden和survivor区域。当然,

原来的survivor from变成了survivor to区域,而survivor to变成了

survivor  from区域。

(2)大对象直接进入老生代。

如果有些大对象一直在新生代中用复制

算法拷贝来拷贝去,也是很大的性能浪费,索性不如直接扔到老生代

侯着。(老生代没有新生代垃圾回收的那么频繁,当然老生代收集一次

的花销要远远大于新生代)

虚拟机提供了参数,可以控制大对象的阀值。这样只要大于所配置

的阀值,自动把对象分配到老生代上。

个人认为大对象者,因为需要连续空间应该只要发生在大数组情况下。

ArrayList的底层实现也是数组,这个需要注意。当然也不排除有人把

一个类中写了n多属性,光引用或者基本类型就构成一个大对象,这个

应该很少见。

书上没写虚拟机默认的大对象阀值是多少,亦或如果不手动加入这个

限制,虚拟机是不设上限的?

(3)长期存活对象进入老生代。

有些对象一直存活不能被回收,但是新生代每次垃圾回收都能容纳这种

对象,这样会造成复制的性能浪费。所以,虚拟机给每个对象设了对象

年龄这么个属性,好像这个值是存在对象头中的。对象新生成时,年龄

设为一,之后在每次新生代的收集中如果能躲过一劫,则年龄加一。

虚拟机的默认阀值是15,当一个对象的年龄大于15,将被请如

老生代名人堂。这个阀值可以设置。

(4)动态对象年龄判定   虚拟机有一个策略,如果survivor

中相同年龄的所有对象的大小的总和大于survivor空间的一半,

年龄大于或者等于该年龄的对象就可以直接进入老年代,无须

等到maxtenuringthreshold中要求的年龄。

策略明白,但是好处是什么?作者没举例,我自己想了几个

例子,不一会又被自己推翻了,姑且相信实现虚拟机垃圾回收的

高手。因为是高手啊!

(5)空间分配担保

在发生新生代minor   gc时,虚拟机会检测之前每次晋升到老

生代的平均大小是否大于老生代的剩余空间大小。如果大于,

则改为直接进行一次老生代full   gc。如果小于,则查看担保设置

是否允许失败,如不允许则会伴随一次full   gc。

为避免full  gc过于频繁,担保失败开关一般是打开的。

取平均值比较是动态概率的手段,并不能保证担保不失败。

担保失败后,仍然需要进行一次   full   gc。

作者说担保失败后在full  gc绕的圈子是最大的,但是我

不甚明白,同样是进行一次full  gc,时机的不同会造成

效率的不同?这个问题有机会再查。

后面这两点作者只是给出了,这种情况出现的例子,但是

没有说出这样做的好处,感觉有点应付(^_^)

《深入理解Java虚拟机》笔记4的更多相关文章

  1. 《Netlogo多主体建模入门》笔记8

    8 -GINI系数计算与 如何使用行为空间做实验     首先,我们加入保底机制. 对于每一个agent,都有一个随机的保底比例 s(每个agent的 s 不都一样,且s初始化之后不会改变) 进行交易 ...

  2. 《Netlogo多主体建模入门》笔记 2

    从自带的模型库开始     财富分配模型 黄色代表稻谷,有的人消化快,有的慢,稻谷的积累代表财富的积累,不涉及交易行为.   点击setup后 ,点击 go   红线--穷人: 绿线-- 中产 : 蓝 ...

  3. 《Netlogo多主体建模入门》笔记4

    4- 从Langton的蚂蚁看Turtle与Patch的交互   这只蚂蚁从10000步开始,就会自发地 “建桥”     Turtle与Patch就好比是,一个方块和一个格子的关系. 一个格子上可以 ...

  4. 《Netlogo多主体建模入门》笔记3

    3- 用“生命游戏”认识Patch     代码:   patches-own[living] to setup clear-all ask patches [ < 0.3[ set pcolo ...

  5. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  6. ES6入门笔记

    ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...

  7. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

  8. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

  9. redis入门笔记(2)

    redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库 ...

  10. redis入门笔记(1)

    redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...

随机推荐

  1. python中的is, ==与对象的相等判断

    在java中,对于两个对象啊a,b,若a==b表示,a和b不仅值相等,而且指向同一内存位置,若仅仅比较值相等,应该用equals.而在python中对应上述两者的是‘is’ 和‘==’. (1) py ...

  2. echarts画k线图

    var charset = echarts.init(document.getElementById("k_line")) $.get(k_line.url_A).done(fun ...

  3. OpenStack 存储服务 Cinder存储节点部署LVM (十四)

    部署在block(10.0.0.103)主机 一)配置lvm 1.安装lvm2软件包 yum install lvm2 -y 2.启动LVM的metadata服务并且设置该服务随系统启动 system ...

  4. SpringMVC一些功能

    1.日期格式转换 当页面提交日期格式时 默认的格式为2017/10/1 如果指定日期格式为2017-10-1 //初始化绑定日期格式--不定义初始化格式时只能默认用yyyy/MM/dd格式 @Init ...

  5. django-BBS(1)

    1.首先分析BBS的设计需要,然后设计相应的数据库.填写在models.py 中 2.修改setting.py中的内容: a.将appname加入INSTALLED_APP中 b.修改DATABASE ...

  6. POJ1456 supermarket [堆]

    题目传送门 Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15192   Accepted: 685 ...

  7. hibernate对象关系映射的配置

    一对一主键关联单双向 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-m ...

  8. 【SPOJ Query on a tree 】 (树链剖分)

    http://acm.hust.edu.cn/vjudge/problem/13013 题意: 有一棵N个节点的树(1<=N<=10000),N-1条边,边的编号为1~N-1,每条边有一个 ...

  9. 【BZOJ 4572】【SCOI 2016】围棋

    http://www.lydsy.com/JudgeOnline/problem.php?id=4572 轮廓线DP:设\(f(i,j,S,x,y)\). \(S\)表示\((i,1)\)到\((i, ...

  10. [xsy1232]Magic

    题意:一个无向图,每个点有$a_i,b_i$,对任意点$i$你都可以花费$b_i$的费用将$a_i$变为$0$,最后你还要付出$\sum\limits_{i=1}^n\max\limits_{(i,j ...