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中对象创建流程与内存分配就结束了,如有疑问,欢迎评论区留言。

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

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

相关文章

国际阿里云:提高CDN缓存命中率教程!!!

CDN缓存命中率低会导致源站压力大,静态资源访问效率低。您可以根据导致CDN缓存命中率低的具体原因,选择对应的优化策略来提高CDN的缓存命中率。 背景信息 CDN通过将静态资源缓存在CDN节点上实现资源访问加速。当客户端访问某资源时,如果CDN节…

算不上最全,但都是必备——Spring这些不会不行啊

Spring 篇 Spring框架中的单例bean是线程安全的吗? 不是线程安全的 Spring bean并没有可变的状态(比如Service类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。 Spring框架中有一个Scope注解,默认的值就是singleton&#xff0…

Windows如何正确设置PHP环境变量以在Git Bash中运行命令

1、随便找一个目录,鼠标右键打开git bash here 2、cd的根目录 3、找到php安装目录 4、 在根目录下打开 vim .bash_profile ,添加环境变量,php地址根据自己的本地地址而定 PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.3.4nts 添加后保存…

基于Rabbitmq和Redis的延迟消息实现

1 基于Rabbitmq延迟消息实现 支付时间设置为30,未支付的消息会积压在mq中,给mq带来巨大压力。我们可以利用Rabbitmq的延迟队列插件实现消息前一分钟尽快处理 1.1定义延迟消息实体 由于我们要多次发送延迟消息,因此需要先定义一个记录消息…

2.6 Windows驱动开发:使用IO与DPC定时器

本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如…

RedCap推动5G规模应用,紫光展锐赋能产业高质量发展

5G R17 RedCap作为面向中高速物联网场景的关键技术和解决方案,可以大幅降低终端的复杂度、成本和功耗。在当前国内5G应用规模化发展关键时期,5G R17 RedCap拥有广大的市场潜力与广泛的应用场景,将有助于推动5G规模应用、构建融通发展的5G生态…

【C++】join ()和detach ()函数详解和示例

简单的来说,join ()方法建立的线程具有阻碍作用,该线程不结束,另一些函数就无法运行。detach ()方法建立的线程,可以和另一些函数同时进行。下面以示例进行详细说明,以帮助大家理解和使用。 目录 join ()detach () jo…

PHP使用文件缓存实现html静态化

<?php // 动态生成的内容 $content "<html><body><h1>time:".date("Y-m-d H:i:s")."</h1></body></html>"; // 静态文件保存路径和文件名 $staticFilePath "file.html"; if(file_exists($s…

Ladybug 全景相机, 360°球形成像,带来全方位的视觉体验

360无死角全景照片总能给人带来强烈的视觉震撼&#xff0c;有着大片的既视感。那怎么才能拍出360球形照片呢&#xff1f;它的拍摄原理是通过图片某个点位为中心将图片其他部位螺旋式、旋转式处理&#xff0c;从而达到沉浸式体验的效果。俗话说“工欲善其事&#xff0c;必先利其…

java实现计数排序

图解 计数排序是一种线性时间复杂度的排序算法&#xff0c;它不基于比较排序&#xff0c;而是根据待排序序列中元素的值来进行排序。 具体的过程如下&#xff1a; 统计序列中每个元素出现的个数&#xff0c;得到一个计数数组count。其中&#xff0c;count[i]表示待排序序列中值…

AIGC:使用bert_vits2实现栩栩如生的个性化语音克隆

1 VITS2模型 1.1 摘要 单阶段文本到语音模型最近被积极研究&#xff0c;其结果优于两阶段管道系统。以往的单阶段模型虽然取得了较大的进展&#xff0c;但在间歇性非自然性、计算效率、对音素转换依赖性强等方面仍有改进的空间。本文提出VITS2&#xff0c;一种单阶段的文本到…

Xilinx Kintex7中端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优缺点4、详细设计方案设计原理框图OV5640及其配置权电阻硬件方案MIPI CSI-2 RX SubsystemSensor Demosaic图像格式转换Gammer LUT伽马校正VDMA图像缓存AXI4-Stream toVideo OutHDMI输出 5、…

Java安全架构 JCA、JCE、JSSE、JAAS

Java语言拥有三大特征&#xff1a;平台无关性、网络移动性和安全性&#xff0c;而Java安全体系结构对这三大特征提供了强大的支持和保证&#xff0c; Java安全体系结构总共分为4个部分&#xff1a; &#xff08;1&#xff09;JCA&#xff08; Java Cryptography Architecture…

工具及方法 - 手机扫条码工具: SCANDIT APP

一般扫个链接使用微信扫一扫即可。扫具体条码&#xff0c;可以在微信里搜索小程序&#xff0c;打开也能扫&#xff0c;得到条码内容。 还有其他方式&#xff0c;比如使用淘宝、百度等APP也可以直接扫码条码&#xff0c;还能得到更多的信息。 使用百度的话&#xff0c;不扫条码…

【洛谷算法题】P5711-闰年判断【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5711-闰年判断【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&a…

诡异的bug之dlopen

序 本文给大家分享一个比较诡异的bug&#xff0c;是关于dlopen的&#xff0c;我大致罗列了我项目中使用代码方式及结构&#xff0c;更好的复现这个问题&#xff0c;也帮助大家进一步理解dlopen. 问题复现 以下是项目代码的文件结构&#xff1a; # tree . ├── file1 │ …

2023-11-15 LeetCode每日一题(K 个元素的最大和)

2023-11-15每日一题 一、题目编号 2656. K 个元素的最大和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。你需要执行以下操作 恰好 k 次&#xff0c;最大化你的得分&#xff1a; 从 nums 中选择一个元素 m 。将选中…

C语言从入门到精通之【概述】

#include指令和头文件 例如#include <stdio.h>&#xff0c;我们经常看到C文件最上面会有类似这样的语句&#xff0c;它的作用相当于把stdio.h文件中的所有内容都输入该行所在的位置。实际上&#xff0c;这是一种“拷贝-粘贴”的操作。 #include这行代码是一条C预处理器…

STM32中使用看门狗实现系统自动复位

STM32中的看门狗(Watchdog)是一种用于监控系统运行状态并在系统故障或死锁时执行自动复位的硬件功能。在本文中&#xff0c;我将介绍如何在STM32微控制器中使用看门狗来实现系统的自动复位。下面是详细的解释&#xff1a; 一、看门狗原理简介 看门狗是一种独立的硬件计时器&am…

DNA甲基化的相关知识

目录 1. DNA甲基化简介 2. 原理 3. 酶分类 4. DNA甲基化类型 5.机制 6. 十大DNA甲基化研究核心问题 6.1 植物中的甲基化 6.2 植物中DNA甲基化的主要功能 6.3 DNA甲基化作为生物标志物的潜力 6.4 DNA甲基化检测方法 1. DNA甲基化简介 DNA甲基化&#xff08;DNA methy…