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运输管理系统整合的可能性。这种整合不仅可以提升仓库流程的可见性,还有助于改善调度…...
测试的专用
测试...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
标注工具核心架构分析——主窗口的图像显示
🏗️ 标注工具核心架构分析 📋 系统概述 主要有两个核心类,采用经典的 Scene-View 架构模式: 🎯 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 🔧 关键函数&…...
