当前位置: 首页 > 编程日记 > 正文

Java堆内存分配与回收策略

java主要在堆上分配内存,而Java堆又分为新生代(YoungGen)和老年代(OldGen)两个部分,新生代又再分为Eden区和Survivor区两部分,本文根据java堆的划分,描述hotspot的内存分配策略。

image

GC垃圾收集分类

  • Minor GC: 发生在新生代中的垃圾收集,采用复制算法。
  • Major GC/Full GC: 发生在老年代的垃圾收集动作,所采用的是标记-清除或者标记-整理算法。

Eden区和Survivor区

对于采用复制算法的虚拟机,新生代通常有一个Eden区和两个Survivor区。
对象优先在Eden区分配,当Eden区没有足够的空间进行分配时,虚拟机讲发起一次Minor GC,Eden中存活的对象将被移动到第一块Survivor区S1,Eden被清空。
当Eden区再次填满,再次触发Minor GC,Eden区和S1中的存活对象被复制送入第二块Survivor区S2中,S1和Eden被清空,下一轮交换S1和S2的角色。
使用两个Survivor区能够简化复制算法的过程,并且避免复制过程中内存碎片的产生。

image

当对象的复制次数达到-XX:MaxTenuringThreshold设置的值(默认-XX:MaxTenuringThreshold=15)时,将被移至老年代。

实验

/*** VM Options:* -Xmx20M 堆最大20M* -Xms20M 堆最小20M* -Xmn10M 新生代为10M* -XX:SurvivorRatio=8 Eden区和Survivor区的比值为8:1* -XX:+PrintGCDetails 输出回收日志及退出时内存各区域情况*/
private static final int _1MB = 1024 * 1024;
public static void testAllocation(){byte[] allocation1,allocation2,allocation3,allocation4;allocation1 = new byte[2 * _1MB];allocation2 = new byte[2 * _1MB];allocation3 = new byte[2 * _1MB];allocation4 = new byte[4 * _1MB];
}

结果:

 PSYoungGen      total 9216K, used 7479K [0x00000007bf600000, 0x00000007c0000000, 0x00000007c0000000)eden space 8192K, 91% used [0x00000007bf600000,0x00000007bfd4df10,0x00000007bfe00000)from space 1024K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007c0000000)to   space 1024K, 0% used [0x00000007bfe00000,0x00000007bfe00000,0x00000007bff00000)ParOldGen       total 10240K, used 4096K [0x00000007bec00000, 0x00000007bf600000, 0x00000007bf600000)object space 10240K, 40% used [0x00000007bec00000,0x00000007bf000010,0x00000007bf600000)Metaspace       used 2692K, capacity 4486K, committed 4864K, reserved 1056768Kclass space    used 288K, capacity 386K, committed 512K, reserved 1048576K

在退出时各个区域结果如上, PSYoungGen的PS指的是Parallel Scavenge垃圾回收器,ParOldGen中的Par指的是Parallel Old垃圾回收器。
设置中堆为10M,新生代为10M,因此老年代为10M。设置SurvivorRatio为8:1,因此Eden区大小为8M,Survivor区大小为1M。因为Survivor区同一时刻只有一个能用于分配,因此PSYoungGen区域总可用大小为9M。
在allocation4进行分配时,新生代eden区已经用了6M,只剩2M,无法进行分配,触发MinorGC。新生代中3个2M大小的对象全部无法放入1M的Survivor区中,所以只能通过分配担保机制将两个2M的对象放入老年代中,再将allocation4的4M对象放入Eden区中。
最终Eden区分配6M,survivor区中没有对象,老年代分配4M。

大对象直接进入老年代

大对象是指需要大量连续内存空间的Java对象。为了避免在Eden区及两个Survivor区之间发生大量的内存复制,虚拟机提供了-XX:PretenureSizeThreshold参数。大于该参数设置值的对象将直接分配在老年代。

长期存活对象直接进入老年代

虚拟机给每个对象定义了一个对象年龄计数器,对象每经过一个MinorGC仍然存活,则年龄加一,当年龄增加到超过-XX:MaxTenuringThreshold设置的值(默认为16)时,将被移至老年代。

空间分配担保

如文章开头的例子中,当出现大量对象在MinorGC后仍然存活的情况,Survivor区无法容纳多余的对象,此时,需要老年代进行分配担保,把Survivor无法容纳的对象直接进入老年代。JDk 6 Update 24之后,担保的规则是,只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行MinorGC,否则将进行Full GC。

参数设置小结

参数描述
-Xms20M堆最小值
-Xmx20M堆最大值
-Xmn10M新生代大小
-XX:SurvivorRatio=8Eden区比Survivor区的大小
-XX:+PrintGCDetails输出回收日志和退出时各内存区域情况
-XX:PretenureSizeThreshold=10M大于该参数设置值的对象直接分配在老年代
-XX:MaxTenuringThreshold=15新生代对象年龄增加到超过该值时,将被移至老年代

相关文章:

清华学长带你从宏观角度看递归

分享嘉宾 赵子一,Datawhale成员,清华大学研究生在读。 分享视频 见公众号“组队学习” 分享内容

关于loader加载的东西必须是继承sprite

如果不是继承sprite转载于:https://www.cnblogs.com/wonderKK/p/3440616.html

CSP 202006-2 稀疏向量 python实现(非满分)(待更新)

试题 代码 (1)30分代码 # 读取n,a,b # n表示向量u,v的维数,a,b分别表示u,v的非零值个数 n, a, b [int(i) for i in input().split()]# 创建两个二维队列存放u,v的信息 List1 [] List2 [] for i in range(a):line …

Java泛型总结

0. 概述 泛型是Jdk1.5引入的特性。泛型是Java程序员最常用且最容易被忽视的知识之一。许多Java程序员只是使用泛型类。但不考虑其工作方式&#xff0c;直到出现问题。 1 术语 用示例进行描述。ArrayList<E>类、ArrayList<Integer>类&#xff1a; 整个称为ArrayLi…

首例利用智能路由网关犯罪嫌疑人被捕:罪名流量劫持

首例利用智能路由网关犯罪嫌疑人被捕:罪名流量劫持 https://tech.sina.cn/digi/nb/2018-05-15/detail-ihapkuvm0295695.d.html 上海市徐汇区人民检察院依法以破坏计算机信息系统罪对全市首例利用智能路由网关设备进行流量劫持的犯罪嫌疑人章某批准逮捕。 经查&#xff0c;2018年…

电子学会青少年编程等级考试Python案例10

案例&#xff1a;彩虹 1、作品 2、代码 背景图片&#xff1a;蓝天白云.png import turtleturtle.Screen().setup(803, 648) turtle.Screen().bgpic("./蓝天白云.png")pen turtle.Pen() pen.speed(10) r 330 size 10 colors [#ff0000, #ff7f00, #ffff00, #00ff0…

CSP 201912-2 回收站选址 python实现+详解

试题 代码 # 读入点的个数 n int(input())# 创建字典&#xff0c;键为点的坐标&#xff0c;值为true&#xff0c;存放所有点 dict {} for i in range(n):x, y [int(m) for m in input().split()]dict[(x, y)] true# 创建字典&#xff0c;存放是回收站的点 dict1 {} for k…

web.xml 配置 加载顺序

web.xml 的加载顺序是&#xff1a;context-param -> listener -> filter -> servlet 。 过滤器执行顺序是根据filter-mapping &#xff0c;不是根据filter顺序。转载于:https://www.cnblogs.com/xiongjinpeng/p/web-xml%e9%85%8d%e7%bd%ae%e5%8a%a0%e8%bd%bd%e9%a1%ba…

python包引用问题

python模块引用梳理 文件组织结构&#xff1a; 复制代码t├── __init__.py├── main.py├── t1│ ├── A.py│ └── __init__.py└── t2 ├── B.py └── __init__.py 复制代码A.py def test(): print t.t1.A.test()B.py def test(): print t.t2.B.test()执行&a…

【新周报(051)】Datawhale组队学习

记录&#xff1a; 按照本周规划&#xff0c;我们正在与阿里云天池合作开展“在线编程训练营”的组队学习活动&#xff0c;在这次活动中我们已经完成12个知识点&#xff08;数组、链表、栈、字符串、树、位运算、双指针、搜索、排序、动态规划、分治、哈希表&#xff09;的视频…

ZJU-java进阶笔记 第一、二周(类与对象,对象交互)

对象变量是对象的管理者&#xff0c;而非所有者 VendingMachine vm new VendingMachine();this指代当前对象 成员函数可以直接&#xff08;不需要点运算符&#xff09;调用本类的其他成员函数 void insertMoney(int amount) {balance balance amount;showBalance(); }定义…

常用的文本处理函数

函数说明left()返回串左边的字符length()返回串的长度locate()找出串的一个子串lower()将串转换成小写upper()将串转换成大写ltrim()去掉串左边空格rtrim()去掉串右边空格substring()返回子串的字符转载于:https://www.cnblogs.com/forphp/p/3442568.html

【青少年编程竞赛交流】02月份微信图文索引

02月份微信图文索引 由于“组队学习”这个公众号的功能主要是组织Datawhale社群中的学习者们每个月的组队学习&#xff0c;所以&#xff0c;我另外新建了这个微信公众号“青少年编程竞赛交流”&#xff0c;在这个公众号上分享有关青少年编程方面的知识&#xff0c;带小朋友们参…

js ~取非运算符的妙用,将-1转为0(或假值)

典型的运用场景就是indexOf

CSP 201912-1 报数 python实现

试题 代码 python n int(input())list [0, 0, 0, 0] m 0 i 1while(i < (mn)):if 7 in str(i) or i % 7 0:list[(i3) % 4] 1m 1i 1for j in list:print(j)

暴裂无声张一鸣

2009年&#xff0c;张一鸣第一次创业&#xff0c;项目名为九九房。最巅峰时&#xff0c;九九房的用户超过600万&#xff0c;移动产品用户量超过100万&#xff0c;日启动10万人次。如果这一项目成功地做下去&#xff0c;张一鸣很有可能成为一名地产大佬。可惜的是&#xff0c;张…

select 不要 用*

背景 说实在的&#xff0c;这有什么好记录的呢。记录这个有啥用&#xff0c;真是技术人员的吹毛求疵。说起来&#xff0c;就是给人装有用吧。既然记录了&#xff0c;也想个相关的段子吧。曾经有个同事写了个sql&#xff0c;效率极差&#xff0c;来了个女同事&#xff0c;竟然解…

【青少年编程竞赛交流】01月份微信图文索引

01月份微信图文索引 由于“组队学习”这个公众号的功能主要是组织Datawhale社群中的学习者们每个月的组队学习&#xff0c;所以&#xff0c;我另外新建了这个微信公众号“青少年编程竞赛交流”&#xff0c;在这个公众号上分享有关青少年编程方面的知识&#xff0c;带小朋友们参…

CSP 201812-1 小明上学 Python实现+详解

题目 代码 #红灯 r 秒&#xff0c;黄灯 y 秒&#xff0c;绿灯 g 秒 r,y,g [int(i) for i in input().split()]#n表示小明总共经过的道路段数和看到的红绿灯数目 n int(input())#0-道路 #1-红灯 需要等r(所读值取代)秒 #2-黄灯 需要等yr(所读值取代)秒(黄灯亮后亮红灯) #3-绿…

Debain 7.2安装配置

一 下载安装Debian 7.2 安装debian CD1,在最后一步&#xff0c;使用网络安装基本界面。 二 修改源 cd /etc/apt mv sources.list sources.list.bak gedit /sources.list 添加&#xff1a; #####################主要&#xff0c;开源&#xff0c;闭源 deb http://mirrors.163.c…

腾讯云与每日优鲜便利购战略签约 引领无人零售2.0时代发展

5月23日-24日&#xff0c;2018腾讯云未来峰会在广州保利世贸博览馆举行&#xff0c;在互联网专场上&#xff0c;腾讯云与每日优鲜便利购签订战略合作协议。双方表示&#xff0c;将充分融合每日优鲜便利购的建筑物级零售价值与腾讯云在云计算、大数据及AI技术的优势&#xff0c;…

青少年编程竞赛交流群第048次活动录播

背景介绍 把电子学会的青少年编程能力等级测评作为游戏的关卡&#xff0c;带着小朋友们升级打怪&#xff0c;这个想法来自于 我从邵慧宁身上得到的启发。 升级打怪&#xff1a; 电子学会考评中心&#xff1a;http://www.qceit.org.cn/bos/default.html 知识内容&#xff1a…

ZJU-java进阶笔记 第三周(对象容器)

ArrayList<String> 读作 ArrayList of String 用来存放String的ArrayList ArrayList类属于范型类&#xff0c;是种容器 ArrayList<String>类属于容器类&#xff0c;用来存放对象&#xff0c;由容器类型和元素类型构成 知道容器类的一些内置用法&#xff0c;省很多事…

Nginx负载均衡配置实例详解

负载均衡是我们大流量网站要做的一个东西&#xff0c;下面我来给大家介绍在Nginx服务器上进行负载均衡配置方法&#xff0c;希望对有需要的同学有所帮助哦。负载均衡先来简单了解一下什么是负载均衡&#xff0c;单从字面上的意思来理解就可以解释N台服务器平均分担负载&#xf…

iOS 设置View阴影

iOS 设置View投影 需要设置 颜色 阴影半径 等元素 UIView *shadowView [[UIView alloc] init];shadowView.frame CGRectMake(100, 100, 100, 100);shadowView.center self.view.center;shadowView.backgroundColor [UIColor whiteColor];//设置阴影颜色shadowView.layer.sh…

ZJU-java进阶笔记 第四周(继承与多态)

继承是面向对象语言的重要特征之一&#xff0c;没有继承的语言只能被称作“使用对象的语言”。 子类从父类那里继承来了所有的成员 ① 除了构造函数&#xff0c;毕竟构造函数和父类同名 ② 得到不等于可以随便使用 如果我们试图重新定义一个在父类中已经存在的成员变量&…

浅谈《think in java》:一 对象导论总结

清单1. 抽象机制&#xff0c;面向对象程序设计方式 java所基于Smalltalk的特性表现一种纯粹的面向对象设计方式&#xff1a; 万物都是对象 程序是对象的集合&#xff08;容器&#xff09;&#xff0c;他们通过发送消息&#xff08;发送请求&#xff09;来告知彼此所要做的。 每…

CSP 201812-2 小明放学 Python实现+详解

试题 代码 # 红灯 r 秒&#xff0c;黄灯 y 秒&#xff0c;绿灯 g 秒 r, y, g [int(i) for i in input().split()]# n表示小明总共经过的道路段数和看到的红绿灯数目 n int(input())# 定义getTime(k,t,time)函数计算时间开销 # k为0&#xff0c;1&#xff0c;2&#xff0c;3时…