6.jvm中对象创建流程与内存分配
目录
- 概述
- 对象的创建流程
- 对象的内存分配方式
- 对象怎样才会进入老年代
- 大对象直接进入老年代
- 内存担保
- jvc 相关指令
- 查看jdk默认使用的gc
- 查看当前jdk支持的有哪些gc
- 查看指定进程当前正在使用的gc
- 结束
概述
相关文章在此总结如下:
| 文章 | 地址 |
|---|---|
| jvm基本知识 | 地址 |
| jvm类加载系统 | 地址 |
| 双亲委派模型与打破双亲委派 | 地址 |
| 运行时数据区 | 地址 |
| 运行时数据区-字符串常量池、程序计数器、直接内存 | 地址 |
对象的创建流程

常量池检查: 检查 new 指令是否能在 常量池中定位到这个类的符号引用,检查类之前是否被加载过。
分配内存空间:
- 指针碰撞:GC 不带压缩功能,Serial和ParNew
- 空闲列表:GC 带压缩功能,CMS
必要信息设置: 对象类的元数据、对象哈希码、GC分代年龄 —> 对象头
对象的内存分配方式
内存分配的方法有两种:
- 指针碰撞 (Bump the Pointer)
- 空间列表 (Free List)
| 分配方法 | 说明 | 收集器 |
|---|---|---|
| 指针碰撞(Bump the Pointer) | 内存地址是连续的(新生代) | Serial和ParNew收集器 |
| 空闲列表(Free List) | 内存地址不连续(老年代) | CMS收集器和Mark-Sweep收集器 |

对象怎样才会进入老年代

空间担保机制: 当新生代无法分配内存的时候,要想将新生代的对象转移至老年代,然后将新对象放入腾空的新生代。此种机制称之为内存担保。
对象进入老年代如下:
- 新对象大多数默认都进入
Eden - 对象进入老年代的四种情况
- 年龄太大
MinorGC15[-XX:MaxTenuringThreshold] - 动态年龄判断:MinorGC后会动态判断年龄,将符合要求对象番移入老年代
- 大对象直接进入老年代
1M[-XX:PretenureSizeThreshold] - MinorGC后存活对象太多无法放入
Survivor
- 年龄太大
动态年龄判断:例子,Survivor 区中有一批对象,年龄分别为 年龄1+年龄2+年龄n的多个对象,对象总和大小超过了Survivor区域的 50%,此时就会将年龄n及以上的对象都放入老年代。
大对象直接进入老年代
测试代码如下:
/*** -XX:NewRatio=2 新生代与老年代比值* -XX:SurvivorRatio=8 新生代中,Eden 与两个Survivor 区域比值* -XX:+PrintGcDetails 打印详细 GC 日志* -XX:PretenureSizeThreshold 对象超过多大值直接在老年代分配,默认值为0,不限制*/
public class YoungOldArea {public static void main(String[] args) {// 分配 20Mbyte[] bytes = new byte[1024 * 1024 * 20];}
}
appledeMacBook-Pro:gc hyl$ javac /Users/hyl/Desktop/jk/jvm/YoungOldArea.java
appledeMacBook-Pro:gc hyl$ cd /Users/hyl/Desktop/jk/jvm
appledeMacBook-Pro:jvm hyl$ java -Xmx60m -Xms60m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails YoungOldArea

内存担保
测试代码如下:
/*** 内存分配担保案例*/
public class MemoryAllocationGuarantee {private static final int _1MB = 1024 * 1024;public static void main(String[] args) {memoryAllocation();}public static void memoryAllocation() {byte[] allocation1, allocation2, allocation3, allocation4;allocation1 = new byte[1 * _1MB];allocation2 = new byte[1 * _1MB];allocation3 = new byte[1 * _1MB];allocation4 = new byte[5 * _1MB];System.out.println("完毕");}
}
appledeMacBook-Pro:jvm hyl$ javac MemoryAllocationGuarantee.java
appledeMacBook-Pro:jvm hyl$ ls
MemoryAllocationGuarantee.class MemoryAllocationGuarantee.java YoungOldArea.class YoungOldArea.java lib
appledeMacBook-Pro:jvm hyl$ java -Xmx20m -Xms20m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+UseSerialGC -XX:+PrintGCDetails MemoryAllocationGuarantee
[GC (Allocation Failure) [DefNew: 3749K->279K(6144K), 0.0039312 secs] 3749K->3351K(19840K), 0.0039781 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
完毕
Heapdef new generation total 6144K, used 5561K [0x00000007bec00000, 0x00000007bf2a0000, 0x00000007bf2a0000)eden space 5504K, 95% used [0x00000007bec00000, 0x00000007bf128920, 0x00000007bf160000)from space 640K, 43% used [0x00000007bf200000, 0x00000007bf245d48, 0x00000007bf2a0000)to space 640K, 0% used [0x00000007bf160000, 0x00000007bf160000, 0x00000007bf200000)tenured generation total 13696K, used 3072K [0x00000007bf2a0000, 0x00000007c0000000, 0x00000007c0000000)the space 13696K, 22% used [0x00000007bf2a0000, 0x00000007bf5a0030, 0x00000007bf5a0200, 0x00000007c0000000)Metaspace used 2668K, capacity 4486K, committed 4864K, reserved 1056768Kclass space used 287K, capacity 386K, committed 512K, reserved 1048576K
appledeMacBook-Pro:jvm hyl$

当新生代无法分配内存的时候,要想将新生代的对象转移至老年代,然后将新对象放入腾空的新生代。
注意: jdk8 设置了 使用 SerialGC ,默认GC不是这样的流程,如下命令行执行的命令
appledeMacBook-Pro:jvm hyl$ java -Xmx20m -Xms20m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails MemoryAllocationGuarantee
完毕
HeapPSYoungGen total 6144K, used 3764K [0x00000007bf980000, 0x00000007c0000000, 0x00000007c0000000)eden space 5632K, 66% used [0x00000007bf980000,0x00000007bfd2d180,0x00000007bff00000)from space 512K, 0% used [0x00000007bff80000,0x00000007bff80000,0x00000007c0000000)to space 512K, 0% used [0x00000007bff00000,0x00000007bff00000,0x00000007bff80000)ParOldGen total 13824K, used 5120K [0x00000007bec00000, 0x00000007bf980000, 0x00000007bf980000)object space 13824K, 37% used [0x00000007bec00000,0x00000007bf100010,0x00000007bf980000)Metaspace used 2668K, capacity 4486K, committed 4864K, reserved 1056768Kclass space used 287K, capacity 386K, committed 512K, reserved 1048576K

jvc 相关指令
查看jdk默认使用的gc
java -XX:+PrintCommandLineFlags -version
查看当前jdk支持的有哪些gc
java -XX:+PrintFlagsFinal -version | grep 'bool Use' | grep 'GC ' | grep -v java
查看指定进程当前正在使用的gc
jhsdb jmap --heap --pid 22397
结束
至此,jvm中对象创建流程与内存分配就结束了,如有疑问,欢迎评论区留言。
相关文章:
6.jvm中对象创建流程与内存分配
目录 概述对象的创建流程对象的内存分配方式对象怎样才会进入老年代大对象直接进入老年代内存担保 jvc 相关指令查看jdk默认使用的gc查看当前jdk支持的有哪些gc查看指定进程当前正在使用的gc 结束 概述 相关文章在此总结如下: 文章地址jvm基本知识地址jvm类加载系…...
算法--搜索与图
这里写目录标题 主要内容DFS思想 BFS思想 DFS与BFS的比较一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 主要内容 DFS 思想 会优先向深处搜索 一旦到达最深处 那么会回溯 但是在回溯的过程中 会边回溯边观察是否有能继…...
ROS 文件系统
ROS文件系统级指的是在硬盘上ROS源代码的组织形式,ROS 的文件系统本质上都还是操作系统文件,可以使用Linux命令来操作这些文件,文件操作,包含增删改查与执行等操作,ROS文件系统的一些常用命令如下: 1.增加…...
车载通信与DDS标准解读系列(1):DDS-RPC
▎RPC & DDS-RPC RPC:Remote Procedure Call,远程过程调用。 远程过程调用是一种进程间通信,它允许计算机程序在另一个地址空间中执行子程序,就好像用别人的东西像用自己的一样,常用于分布式系统。 远程过程调用…...
通过构造树形结构介绍map的用法
构造TreeSelect树形结构: 当我们拿到的数据与我们要用的数据不一致时,就要改造成自己想要的数据结构。 后端拿到的数据结构: public class TPMGroup{public string DepName { get; set; }public List<staff> TPMList { get; set; }pu…...
代码随想录算法训练营Day 53 || 1143.最长公共子序列、1035.不相交的线、53. 最大子序和
1143.最长公共子序列 力扣题目链接 给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何…...
Oracle JDBC数据库驱动程序介绍
Maven Central上所有Oracle JDBC数据库驱动程序 现在不仅可以在Maven Central上使用甲骨文数据库最新版本,而且还可以获得所有受支持的Oracle JDBC驱动程序发行版,包括19.3.0.0、18.3.0.0、12.2.0.1和11.2.0.4。从现在开始,Maven Central确实…...
scipy实现单因素方差分析
经典例题 某校高二年级共有四个班,采用四种不同的教学方法进行数学教学,为了比较这四种教学法的效果是否存在明显的差异,期末统考后,从这四个班中各抽取 5 名考生的成绩,如下所示。 班级 一班 二班 三班 四班 …...
深度学习实战59-NLP最核心的模型:transformer的搭建与训练过程详解,手把手搭建与跑通
大家好,我是微学AI,今天给大家介绍一下深度学习实战59-NLP最核心的模型:transformer的搭建与训练过程详解,手把手搭建与跑通。transformer是一种基于自注意力机制的深度学习模型,由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它最初被设计用来处理序…...
一阶滤波器(一阶巴特沃斯滤波器)
连续传递函数G(s) 离散传递函数G(z) 转换为差分方程形式 一阶巴特沃斯滤波器Filter Designer参数设计:参考之前的博客Matlab的Filter Designer工具设计二阶低通滤波器 设计采样频率100Hz,截止频率20Hz。 注意:设计参数使用在离散系统中&…...
.net core中前端vue HTML5 History 刷新页面404问题
放到启动的应用程序的最后面 app.Run(async (context) > {context.Response.ContentType "text/html";await context.Response.SendFileAsync(Path.Combine(env.WebRootPath, "index.html")); });https://blog.csdn.net/lee576/article/details/88355…...
【152.乘积最大子数组】
目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int maxProduct(vector<int>& nums) {int nnums.size();vector<int> f(n);vector<int> g(n);f[0]g[0]nums[0];int retnums[0];for(int i1;…...
如何开发OA系统场景的系统架构
1.开发OA系统场景的系统架构 针对开发OA系统的场景,以下是一个简单的系统架构示例,包括前端、后端和数据库三个基本部分: 前端: 使用React框架进行前端开发,构建用户界面和交互逻辑。前端模块包括日程管理模块、文档管…...
spring boot 集成 RedisSearch 和 RedisJSON
1. 准备工作 环境说明 java 8;redis7.2.2,redis集成RedisSearch、redisJson 模块;spring boot 2.5在执行 redis 命令, 或者监控 程序执行的redis 指令时,可以采用 redisinsight查看,下载地址。 背景说明 需…...
【Kotlin精简】第8章 协程
1 简介 Kotlin 中的协程提供了一种全新处理并发的方式,您可以在 Android 平台上使用它来简化异步执行的代码。协程是从 Kotlin 1.3 版本开始引入,但这一概念在编程世界诞生的黎明之际就有了,最早使用协程的编程语言可以追溯到 1967 年的 Sim…...
【MATLAB源码-第79期】基于蚯蚓优化算法(EOA)的栅格路径规划,输出做短路径图和适应度曲线。
操作环境: MATLAB 2022a 1、算法描述 蚯蚓优化算法(Earthworm Optimisation Algorithm, EOA)是一种启发式算法,灵感来源于蚯蚓在自然界中的行为模式。蚯蚓优化算法主要模仿了蚯蚓在寻找食物和逃避天敌时的行为策略。以下是蚯蚓…...
RPC实现简单解析
RPC是什么,先摘取一段解释: RPC全称为远程过程调用(Remote Procedure Call),它是一种计算机通信协议,允许一个计算机程序调用另一个计算机上的子程序,而无需了解底层网络细节。通过RPCÿ…...
【Ubuntu】Ubuntu20.04下安装视频播放器vlc和录屏软件ssr
【Ubuntu】Ubuntu20.04下安装视频播放器vlc和录屏软件ssr 文章目录 【Ubuntu】Ubuntu20.04下安装视频播放器vlc和录屏软件ssr1. 安装视频播放器vlc2. 安装录屏软件ssr 1. 安装视频播放器vlc sudo apt-get install vlcvlc是一款比较简洁的视频播放器,如下所示 2. 安…...
WMS仓储管理系统与TMS系统整合后的优势
随着全球化的加速和供应链网络的日益复杂,仓库和运输成为企业运营中的两个关键环节。为了更高效地管理这两个环节,许多企业开始探索将WMS仓储管理系统和TMS运输管理系统整合的可能性。这种整合不仅可以提升仓库流程的可见性,还有助于改善调度…...
测试的专用
测试...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
