6.jvm中对象创建流程与内存分配

news2024/10/7 6:39:33

目录

  • 概述
  • 对象的创建流程
  • 对象的内存分配方式
    • 对象怎样才会进入老年代
      • 大对象直接进入老年代
      • 内存担保
  • 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) {
        // 分配 20M
        byte[] 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] 
完毕
Heap
 def 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 1056768K
  class 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
完毕
Heap
 PSYoungGen      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 1056768K
  class 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中对象创建流程与内存分配就结束了,如有疑问,欢迎评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1206306.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常用命令——bzip2命令

在线Linux命令查询工具 bzip2 将文件压缩成bz2格式 补充说明 bzip2命令用于创建和管理(包括解压缩)“.bz2”格式的压缩包。我们遇见Linux压缩打包方法有很多种,以下讲解了Linux压缩打包方法中的Linux bzip2命令的多种范例供大家查看&…

Python | 机器学习之数据清洗

​ 🌈个人主页:Sarapines Programmer🔥 系列专栏:《人工智能奇遇记》🔖少年有梦不应止于心动,更要付诸行动。 目录结构 1. 机器学习之数据清洗概念 1.1 机器学习 1.2 数据清洗 2. 数据清洗 2.1 实验目的…

Changes to Captions: An Attentive Network forRemote Sensing Change Captioning

字幕的变化:一个用于遥感变化字幕的关注网络 IEEE Transactions on Image Processing Shizhen Chang, Pedram Ghamisi 2023 摘要:近年来,高级研究集中在使用自然语言处理(NLP)技术对遥感图像进行直接学习和分析。准…

Origin:科研绘图与学术图表绘制从入门到精通

文章目录 一、引言二、安装和启动Origin三、创建和保存图表四、深入学习Origin绘图功能五、应用Origin进行科研绘图和学术图表绘制六、总结与建议《Origin科研绘图与学术图表绘制从入门到精通》亮点内容简介作者简介目录获取方式 一、引言 Origin是一款功能强大的数据分析和科…

家政服务小程序源码系统+上门预约服务 源码完全开源可二次开发 带完整的搭建教程

在互联网的快速发展下,传统的家政服务行业也在逐步向数字化、智能化方向转型。为了满足消费者对于家政服务的高品质需求,罗峰给大家分享一款基于微信小程序的上门预约家政服务系统。该系统采用完全开源的源码系统,可进行二次开发,…

CAD Exchanger SDK 须知的开发配置--Crack

支持的配置 目录 支持的编程语言 C 支持C# 支持Java支持Python支持JavaScript 支持 CAD Exchanger SDK 是一组跨平台库,目前支持下列配置。随着时间的推移,旧版本的编译器、体系结构或依赖的第三方库从主要支持级别变为次要支持级别,然后被弃…

ubuntu利用crontab反弹shell

事情源于自,我利用redis未授权访问漏洞在向ubuntu的/varspool/cron/crontabs目录下创建的任务计划文件去反弹shell时,发现shell并不能反弹到自己的centos2上 (1)在ubuntu中进入/var/spool/cron/crontabs/目录 cd /var/spool/cro…

不应该被忽视的10个好用的PDF文档修改器

您在寻找最好的免费开源 PDF 编辑器吗?您是否正在寻找免费编辑 PDF 文档的解决方案?如果您正在寻找此类问题的答案。那么,亲爱的朋友,您来对地方了,因为今天,在本文中,我将讨论一些适用于 Windo…

2023-2024 年适用于 Windows 电脑的顶级视频录制软件

想捕捉您正在在线观看的视频吗?使用网络摄像头录制视频会议以供日后参考。正在寻找可以完成这些任务的视频捕捉软件?这篇文章说明了一切。以下是一些适用于 Windows PC 的最佳视频录制工具。 什么是视频录制软件? 顾名思义,视频捕…

基于SSM的“镜头人生”约拍网站设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:JSP 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

Python机器学习算法入门教程(第五部分)

接着Python机器学习算法入门教程(第四部分),继续展开描述。 二十五、Python Sklearn库SVM算法应用 SVM 是一种有监督学习分类算法,输入值为样本特征值向量和其对应的类别标签,输出具有预测分类功能的模型&#xff0c…

电脑技巧:推荐基于浏览器的远程桌面访问控制工具

一、软件简介 Getscreen.me是一个基于浏览器的远程桌面访问控制工具,可以轻松地远程访问控制特定设备。并且注册登录账户实现允许设置具有永久访问权限的设备,可以通过一键进行快速连接访问,无需共享 ID、密码或任何内容。 Getscreen.me采用…

C++标准模板(STL)- 类型支持 (受支持操作,检查类型是否拥有未被弃置的析构函数)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

记录pytorch实现自定义算子并转onnx文件输出

概览&#xff1a;记录了如何自定义一个算子&#xff0c;实现pytorch注册&#xff0c;通过C编译为库文件供python端调用&#xff0c;并转为onnx文件输出 整体大概流程&#xff1a; 定义算子实现为torch的C版本文件注册算子编译算子生成库文件调用自定义算子 一、编译环境准备…

Linux可以投屏到电视吗?用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开webcast.airdroid.com。这就是AirDroid Cast的网页版。你可以看到中间白色框框的右上角有个…

12358748257

问题一&#xff1a;.浮点数打印问题 float red_increment (target_red_value - initial_red_value) / STEPS; u8 STEPS 100; printf("绿色值每一次增量------%f\n", red_increment); 后面三个参数均为u8类型 希望采用 %f打印出每次的步进值。但是结果为空白 希…

聚观早报 |滴滴发布Q3财报;小鹏G9连续销量排行第一

【聚观365】11月14日消息 滴滴发布Q3财报 小鹏G9连续销量排行第一 XREAL双11实现7倍增长 真我GT5 Pro真机图 2024年智能手机AI功能竞争激烈 滴滴发布Q3财报 滴滴在其官网发布2023年三季度业绩报告。报告显示&#xff0c;三季度滴滴实现总收入514亿元&#xff0c;同比增长…

【Mysql系列】Mysql基础篇

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

YOLOv8-Seg改进:小目标涨点系列篇 | TPC-YOLO-seg不同场景小目标分割均能提升 | 23年顶刊最新成果

🚀🚀🚀本文改进:轻量级的基于注意力的网络 TPC-YOLO-seg用于微小物体分割 🚀🚀🚀TPC-YOLO-seg 小目标分割首选,暴力涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何…

SAP中销售业务的查询修改及冲销操作手册

目的 物流在销售订单发货开票出问题时进行查询分析及处理冲销的相关操作 触发条件 销售业务出现变更导致需要重新做销售或人为错误 必要条件 订单&#xff0c;交货单&#xff0c;发票己完成并过账 有用提示 在实际冲销业务过程中需要去分析&#xff0c;在了解业务的情况下去…