《深入理解Java虚拟机》笔记4
垃圾回收器是垃圾回收算法的实现,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的更多相关文章
- 《Netlogo多主体建模入门》笔记8
8 -GINI系数计算与 如何使用行为空间做实验 首先,我们加入保底机制. 对于每一个agent,都有一个随机的保底比例 s(每个agent的 s 不都一样,且s初始化之后不会改变) 进行交易 ...
- 《Netlogo多主体建模入门》笔记 2
从自带的模型库开始 财富分配模型 黄色代表稻谷,有的人消化快,有的慢,稻谷的积累代表财富的积累,不涉及交易行为. 点击setup后 ,点击 go 红线--穷人: 绿线-- 中产 : 蓝 ...
- 《Netlogo多主体建模入门》笔记4
4- 从Langton的蚂蚁看Turtle与Patch的交互 这只蚂蚁从10000步开始,就会自发地 “建桥” Turtle与Patch就好比是,一个方块和一个格子的关系. 一个格子上可以 ...
- 《Netlogo多主体建模入门》笔记3
3- 用“生命游戏”认识Patch 代码: patches-own[living] to setup clear-all ask patches [ < 0.3[ set pcolo ...
- 每天成长一点---WEB前端学习入门笔记
WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...
- ES6入门笔记
ES6入门笔记 02 Let&Const.md 增加了块级作用域. 常量 避免了变量提升 03 变量的解构赋值.md var [a, b, c] = [1, 2, 3]; var [[a,d] ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- React.js入门笔记
# React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...
- redis入门笔记(2)
redis入门笔记(2) 上篇文章介绍了redis的基本情况和支持的数据类型,本篇文章将介绍redis持久化.主从复制.简单的事务支持及发布订阅功能. 持久化 •redis是一个支持持久化的内存数据库 ...
- redis入门笔记(1)
redis入门笔记(1) 1. Redis 简介 •Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure serv ...
随机推荐
- 使用JavaScript实现长方形、直角三角形、平行四边形、等腰三角形、倒三角、数字三角形
[循环嵌套的规律] 1.外层循环控制行数,内层循环控制每行中元素的个数. [图形题思路] 1.确定图形有几行,行数即为外层循环次数: 2.确定每行中有几种元素组成,有几种元素表示有几 ...
- cordova热更新插件的使用
cordova常用命令 一.添加插件 新建Cordova项目 cordova create CordovaHotCode com.ezample.hotcode 添加Android平台 在新建项目的 ...
- C/C++宏的用法
今天看caffe源码的时候看到了很多宏定义的内容,苦于代码基础薄弱,无法全部理解,故在网上搜得此篇好文,转载一发附原文地址:http://blog.csdn.net/hanchaoman/articl ...
- 安装 gcc 编译器
1.安装编译工具 gcc.gcc-c++.make 注意解决依赖关系,推荐使用 yum 安装,若不能联网可使用安装光 盘做为 yum 源 1)编辑 yum 配置文件: Mount /dev/cdrom ...
- HTTP(HyperText Transport Protocol)超文本传输协议的状态码
关于HTTP状态码:是用于表示网页服务器HTTP响应状态的3位数字代码. 所有状态码的第一个数字代表了响应的五种状态之一. 1xx:消息:这一类型的状态码代表请求已被接受,需要继续处理 2xx:成功: ...
- CF #502
#include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include ...
- CodeForces 143C Help Farmer
暴力枚举. 枚举最小的那个数字,不会超过$1000$,剩下的两个数字根号的效率枚举一下即可. #include<bits/stdc++.h> using namespace std; lo ...
- Codeforces GYM 101968 A. Tree Game
差点自闭,感谢大佬帮忙找bug 题目:https://codeforces.com/gym/101968/problem/A 找树的重心+思维 找到树的重心,如果重心只有一个,以重心为根节点dfs,求 ...
- 【BZOJ 1901】【ZJU 2112】Dynamic Rankings
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 重新用整体二分写了一下. 整体二分的思想详见论文. 貌似带修区间k大和静态区间k大都是\(O( ...
- [DesignPattern]Builder设计模式
模式的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 模式的使用场景 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部件或零件,都可以装配到一个对象中,但是 ...