JVM源码分析之堆内存的初始化
原创申明:本文由公众号【猿灯塔】原创,转载请说明出处标注
“365篇原创计划”第十五篇。
今天呢!灯塔君跟大家讲:
JVM源码分析之堆内存的初始化
Universe::initialize_heap方法中,实现如下:1、初始化GC策略;
2、初始化分代生成器;
3、初始化Java堆管理器;
GC策略初始化
其中MarkSweepPolicy是基于标记-清除思想的GC策略,如果虚拟机启动参数没有指定GC算法,则使用默认使用UseSerialGC,以ASConcurrentMarkSweepPolicy策略为例,对GC策略的初始化过程进行分析:
调用父类ConcurrentMarkSweepPolicy构造方法,其中initialize_all定义在GenCollectorPolicy中,实现如下:
initialize_flags
负责对新生代、老年代以及永久代设置的内存大小进行对齐调整。
CollectorPolicy::initialize_flags实现,永久代的初始值默认为4M,最大值为64M,可以通过参数-XX:PermSize和-XX:MaxPermSize进行重新设置。2、调整新生代
GenCollectorPolicy::initialize_flags实现:NewSize默认为1M,最大值需要设置,可以通过参数-XX:NewSize和-XX:MaxNewSize或-Xmn进行设置;NewRatio为老年代与新生代的大小比值,默认为2;SurvivorRatio为新生代中Eden和Survivor的大小比值,默认为8;initialize_size_info
设置新生代、老年代以及永久代的容量,包括初始值、最小值和最大值
InitialHeapSize和Arguments::min_heap_size()可以通过参数-Xms进行设置。_initial_heap_byte_size;_min_heap_byte_size;_max_heap_byte_size;设置新生代
1、如果MaxNewSize重新设置过,即设置-Xmn参数,则根据不同情况设置max_new_size;
2、否则通过scale_by_NewRatio_aligned方法根据NewRatio和_max_heap_byte_size重新计算max_new_size值,其中NewRatio默认为2,表示新生代的大小占整个堆的1/3;
3、如果最大堆_max_heap_byte_size等于最小堆_min_heap_byte_size,则设置新生代的初始值、最小值和最大值为max_new_size,否则执行步骤4;
4、如果NewSize重新设置过,即设置了-Xmn参数,则使用NewSize设置_min_gen0_size,否则使用scale_by_NewRatio_aligned方法重新计算新生代最小值和初始值,实现如下:
设置老年代
OldSize,则使用min_heap_byte_size() - min_gen0_size(),即最小堆大小和新生代最小值之差设置老年代最小值,初始值类似;OldSize,通过adjust_gen0_sizes方法重新设置新生代的最小值和初始值;初始化分代生成器
GenerationSpec实现,永久代通过PermanentGenerationSpec实现。每个生成器GenerationSpec实例保存当前分代的GC算法、内存的初始值和最大值。
GenerationSpec实例中的数据,如果设置UseSharedSpaces和DumpSharedSpaces,还需要保存额外的数据。ConcurrentMarkSweepPolicy::initialize_generations方法实现了分代生成器的初始化,实现如下:初始化Java堆管理器
GenCollectedHeap是整个Java堆的管理器,负责Java对象的内存分配和垃圾对象的回收,通过initialize方法进行初始化,实现如下:
number_of_generations方法获取分代数量,如果使用ASConcurrentMarkSweepPolicy,默认分代数为2;align方法对齐生成器的初始值和最大值(为什么需要一直对齐,我觉得前面初始化GC策略的时候已经对齐很多次了)3、通过allocate为堆申请空间;
init方法为对应的分代分配内存空间;5、如果当前的GC策略为ConcurrentMarkSweepPolicy,则通过create_cms_collector创建GC线程。
365天干货不断微信搜索「猿灯塔」第一时间阅读,回复【资料】【面试】【简历】有我准备的一线大厂面试资料和简历模板
JVM源码分析之堆内存的初始化的更多相关文章
- JVM源码分析之堆外内存完全解读
JVM源码分析之堆外内存完全解读 寒泉子 2016-01-15 17:26:16 浏览6837 评论0 阿里技术协会 摘要: 概述 广义的堆外内存 说到堆外内存,那大家肯定想到堆内内存,这也是我们 ...
- JVM源码分析之警惕存在内存泄漏风险的FinalReference(增强版)
概述 JAVA对象引用体系除了强引用之外,出于对性能.可扩展性等方面考虑还特地实现了四种其他引用:SoftReference.WeakReference.PhantomReference.FinalR ...
- JVM源码分析之SystemGC完全解读
JVM源码分析之SystemGC完全解读 概述 JVM的GC一般情况下是JVM本身根据一定的条件触发的,不过我们还是可以做一些人为的触发,比如通过jvmti做强制GC,通过System.gc触发,还可 ...
- JVM源码分析之Java对象头实现
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十一篇. 今天呢!灯塔君跟大家讲: JVM源码分析之Java对象头实现 HotSpot虚拟机中,对象在内存中的布局分为三 ...
- JVM源码分析之一个Java进程究竟能创建多少线程
JVM源码分析之一个Java进程究竟能创建多少线程 原创: 寒泉子 你假笨 2016-12-06 概述 虽然这篇文章的标题打着JVM源码分析的旗号,不过本文不仅仅从JVM源码角度来分析,更多的来自于L ...
- JVM源码分析之Metaspace解密
概述 metaspace,顾名思义,元数据空间,专门用来存元数据的,它是jdk8里特有的数据结构用来替代perm,这块空间很有自己的特点,前段时间公司这块的问题太多了,主要是因为升级了中间件所 ...
- JVM源码分析之JVM启动流程
原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 “365篇原创计划”第十四篇. 今天呢!灯塔君跟大家讲: JVM源码分析之JVM启动流程 前言: 执行Java类的main方法,程序就能运 ...
- JVM源码分析-JVM源码编译与调试
要分析JVM的源码,结合资料直接阅读是一种方式,但是遇到一些想不通的场景,必须要结合调试,查看执行路径以及参数具体的值,才能搞得明白.所以我们先来把JVM的源码进行编译,并能够使用GDB进行调试. 编 ...
- JVM源码分析-类加载场景实例分析
A类调用B类的静态方法,除了加载B类,但是B类的一个未被调用的方法间接使用到的C类却也被加载了,这个有意思的场景来自一个提问:方法中使用的类型为何在未调用时尝试加载?. 场景如下: public cl ...
随机推荐
- Java实现 LeetCode 112 路径总和
112. 路径总和 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标 ...
- Java实现LeetCode_0013_RomanToInteger
package javaLeetCode.primary; import java.util.HashMap; import java.util.Map; import java.util.Scann ...
- java实现祖冲之割圆法
祖冲之割圆法 南北朝时,我国数学家祖冲之首先把圆周率值 计算到小数点后六位,比欧洲早了1100年!他采 用的是称为"割圆法"的算法,实际上已经蕴含 着现代微积分的思想. 如图[1. ...
- java实现第六届蓝桥杯格子中输出
格子中输出 格子中输出 stringInGrid方法会在一个指定大小的格子中打印指定的字符串. 要求字符串在水平.垂直两个方向上都居中. 如果字符串太长,就截断. 如果不能恰好居中,可以稍稍偏左或者偏 ...
- 11.经典O(n²)比较型排序算法
关注公号「码哥字节」修炼技术内功心法,完整代码可跳转 GitHub:https://github.com/UniqueDong/algorithms.git 摘要:排序算法提多了,很多甚至连名字你都没 ...
- 【asp.net core 系列】8 实战之 利用 EF Core 完成数据操作层的实现
0. 前言 通过前两篇,我们创建了一个项目,并规定了一个基本的数据层访问接口.这一篇,我们将以EF Core为例演示一下数据层访问接口如何实现,以及实现中需要注意的地方. 1. 添加EF Core 先 ...
- 如何使用PHP生成图片
/** * 从图片文件创建Image资源 * @param $file 图片文件,支持url * @return bool|resource 成功返回图片image资源,失败返回false */ fu ...
- css固定宽高DIV内部元素垂直居中的方法
应用案例 案例是这样的,一个外层div,高宽是固定的,但是里面内容不是固定的.很多朋友的做法是头部加一个padding或者margin,这样,里面内容显得貌似是居中了,但是假如内容变化,这样头部的固定 ...
- 2019-02-09 python爬取mooc视频项目初级简单版
今天花了一下午时间来做这东西,之前没有自己写过代码,50几行的代码还是查了很多东西啊,果然学起来和自己动起手来完全是两码事. 方案:requests库+正则表达式提取视频下载链接+urlretriev ...
- spring Cloud网关之Spring Cloud Gateway
Spring Cloud Gateway是什么?(官网地址:https://cloud.spring.io/spring-cloud-gateway/reference/html/) Spring C ...