JVM对象的创建流程与内存分配

news2024/12/29 8:09:11

对象的创建流程与内存分配

  • 创建流程
  • 对象内存分配方式
  • 内存分配安全问题
  • 对象内存分配流程【重要】:
    • 对象怎样才会进入老年代?重点
  • 案例演示:对象分配过程
    • 大对象直接进入老年代
    • 02-对象内存分配的过程:

创建流程

加载
验证
解析
准备
初始化
使用
写在

对象内存分配方式

内存分配的方法有两种:不同垃圾收集器不一样

  • 指针碰撞(Bump the Pointer)
  • 空闲列表(Free List)
    在这里插入图片描述
    指针碰撞示意图:
    在这里插入图片描述

内存分配安全问题

在分配内存的时候,虚拟机给A线程分配内存过程中,指针未修改。此时B线程同时使用了同样一块内存。是不是就出现了线程的安全性问题?
在JVM中有两种解决办法:

  1. CAS 是乐观锁的一种实现方式。虚拟机采用 CAS 配上失败重试的方式保证更新操作的原子性。
  2. TLAB本地线程分配缓冲(Thread Local Allocation Buffer即TLAB):为每一个线程预先分配一块内存

JVM在第一次给线程中的对象分配内存时,首先使用CAS进行TLAB的分配。当对象大于TLAB中的剩余内存或TLAB的内存已用尽时,再采用上述的CAS进行内存分配。

对象内存分配流程【重要】:

在这里插入图片描述

对象怎样才会进入老年代?重点

对象内存分配:

  • 新生代:新对象大多数都默认进入新生代的Eden区
  • 进入老年代的条件:四种情况
    在这里插入图片描述
    在这里插入图片描述
    老年代的担保示意图:
    在这里插入图片描述

小结

  1. 当Eden区存储不下新分配的对象时,会触发minorGC
  2. GC之后,还存活的对象,按照正常逻辑,需要存入到Survivor区。
  3. 当无法存入到幸存区时,此时会触发担保机制
  4. 发生内存担保时,需要将Eden区GC之后还存活的对象放入老年代。后来的新对象或者数组放入Eden区。

案例演示:对象分配过程

大对象直接进入老年代

package com.hero.jvm.object;
/**
* 测试:大对象直接进入到老年代
* -Xmx60m -Xms60m -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:+PrintGCDetails * -XX:PretenureSizeThreshold
*
*/
public class YoungOldArea {
    public static void main(String[] args) {
        byte[] buffer = new byte[1024*1024*20]; //20M
    }
}
-XX:NewRatio=2 新生代与老年代比值
-XX:SurvivorRatio=8 新生代中,Eden与两个Survivor区域比值 
-XX:+PrintGCDetails 打印详细GC日志
-XX:PretenureSizeThreshold 对象超过多大直接在老年代分配,默认值为0,不限制

在这里插入图片描述

02-对象内存分配的过程:

/*
-Xmx600m -Xms600m -XX:+PrintGCDetails
*/
public class HeapInstance {
    public static void main(String[] args) {
        List<Picture> list = new ArrayList<>();
        while (true){
} }
    try {
        Thread.sleep(20);
    } catch (InterruptedException e) {
        e.printStackTrace();
}
    list.add(new Picture(new Random().nextInt(1024 * 1024)));
}
class Picture{
    private byte[] pixels;
    public Picture(int length){
        this.pixels = new byte[length];
    }
}

在这里插入图片描述

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

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

相关文章

C语言系列(所需基础:大学C语言及格)-3-字符串/ASCII码表

文章目录 一、字符串二、ASCII码表 一、字符串 用" "来定义字符串&#xff1a; #include <stdio.h>int main() {"";//空字符串"hkl";//由""定义的字符串return(0); }用数组来存储字符串&#xff0c;并打印&#xff1a; #incl…

箱形理论在交易策略中的实战应用与优化

箱形理论&#xff0c;简单来说&#xff0c;就是将价格波动分成一段一段的方框&#xff0c;研究这些方框的高点和低点&#xff0c;来推测价格的趋势。 在上升行情中&#xff0c;价格每突破新高价后&#xff0c;由于群众惧高心理&#xff0c;可能会回跌一段&#xff0c;然后再上升…

jenkins远程触发构建报:Error 403 No valid crumb was included in the request

最近在跨jenkins触发构建的时候发现不能触发相应的项目&#xff0c;报如下图错误 解决方案&#xff1a; 1、安装Build Authorization Token Root Plugin插件 安装完成后去配置API Token&#xff0c;用户列表&#xff0c;配置用户的API Token&#xff0c;生成后记得保存 2、项…

Windows Server 2012 安装

1.镜像安装 镜像安装:Windows Server 2012 2.安装过程(直接以图的形式呈现) 2012激活秘钥:J7TJK-NQPGQ-Q7VRH-G3B93-2WCQD

【flutter】第一个flutter项目

前言 我们通过Android Studio来创建flutter项目。 安装dart和flutter插件 新版编译器需要先安装flutter插件才能构建flutter项目。 项目目录 我们基本就在lib中写代码 项目启动

一文读懂——SSL证书选择免费还是付费

免费SSL证书通常由一些知名的证书颁发机构&#xff08;CA&#xff09;提供。这些免费证书提供了基本的加密功能&#xff0c;足以保护网站的数据传输安全。它们的优点在于免费&#xff0c;对于个人网站或小型企业来说&#xff0c;可以有效地降低网站运营成本。 然而&#xff0c;…

挑战30天学完Python:Day16 日期时间

&#x1f4d8; Day 16 &#x1f389; 本系列为Python基础学习&#xff0c;原稿来源于 30-Days-Of-Python 英文项目&#xff0c;大奇主要是对其本地化翻译、逐条验证和补充&#xff0c;想通过30天完成正儿八经的系统化实践。此系列适合零基础同学&#xff0c;或仅了解Python一点…

(十一)【Jmeter】线程(Threads(Users))之jp@gc-Ultimate Thread Group

简述 操作路径如下: 作用:提供了高级的线程组控制选项,支持更复杂的场景模拟。配置:设置多种线程控制参数,如启动延迟、启动线程数、并发压测持续时间、关闭线程时间等。使用场景:针对特定需求进行高级的并发访问模拟,如流量控制、延迟启动等。优点:提供了丰富的控制…

“目标检测”任务基础认识

“目标检测”任务基础认识 1.目标检测初识 目标检测任务关注的是图片中特定目标物体的位置。 目标检测最终目的&#xff1a;检测在一个窗口中是否有物体。 eg:以猫脸检测举例&#xff0c;当给出一张图片时&#xff0c;我们需要框出猫脸的位置并给出猫脸的大小&#xff0c;如…

k8s kubectl陈述式资源管理及命令详解,项目流程与发布示例

目录 Kubernetes kubectl 命令表 _ Kubernetes(K8S)中文文档_Kubernetes中文社区http://docs.kubernetes.org.cn/683.html kubectl概念 概述 用途 kubectl语法 基本语法 简单举例 kubectl使用详解 set&#xff1a;更新 部署发布操作 暴露service service的作用 使…

halcon的灰度变换(图像增强)

参考Halcon代码&#xff1a; w:3 h:3 gen_image_const (Image, byte, w, h) get_domain (Image, Domain) get_region_points (Domain, Rows, Columns) *将图像的所有灰度值都设置为1 grayvals:[1,20,3,10,1,1,1,1,1] set_grayval (Image, Rows, Columns, grayvals) get_grayva…

星河做市基金会全球DAO社区启动,为数字货币市场注入新活力

2024年的数字货币市场即将迎来一次重要的历史性时刻 — 比特币减半&#xff0c;这四年一次的事件将成为全球数字资产市场的焦点&#xff0c;预示着新一轮的牛市浪潮即将到来。在这个关键时刻&#xff0c;星河做市基金会展现出其作为区块链行业领先市值管理公司的独特魅力。 GA…

Angular升级后运行编译变慢?如何解决?

公司的Angular项目升级后&#xff0c;使用体验感十分不好&#xff0c;运行、编译的时间明显增长&#xff0c;工作效率是十分低下&#xff0c;但奈何公司的大佬们都有自己的事情要忙&#xff0c;结识的大佬也不够多&#xff0c;只能靠自己找度娘了。但是&#xff0c;哎&#xff…

2024年最新1000个Java毕业设计选题参考

文章目录 2024年最新Java毕业设计选题参考一、Java毕业设计选题参考二、javaweb毕业设计选题三、springboot/ssm毕业设计选题参考 源码获取&#xff1a; 博主介绍&#xff1a;✌全网粉丝7W,CSDN博客专家、Java大数据领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/In…

初识字符串哈希(Hash)

目录 1.字符串哈希的介绍 2.自然溢出哈希 3.单哈希 4.双哈希 5.例题分析 1.自然溢出哈希AC代码 2.单哈希AC代码 3.双哈希AC代码 6.总结 1.字符串哈希的介绍 字符串哈希是一种将字符串映射为一个固定长度的整数或哈希值的技术。它的主要目的是加速字符串比较和搜索操作…

UE开发01--part 1:创建游戏模式、角色、控制器

1&#xff0c;右键选择新建C类 2&#xff0c;选择GameModeBase 3&#xff0c;随便命名&#xff0c;类的类型-->选择&#xff1a;公共&#xff1b; 这个选项会把.h和.cpp文件分开&#xff0c;方便我们查看与修改代码。 4.打开 VS 编辑器&#xff0c;查看我们刚刚创建得两文件…

机器学习 day38(有放回抽样、随机森林算法、XGBoost)

有放回抽样 有放回抽样和无放回抽样的区别&#xff1a;有放回可以确保每轮抽取的结果不一定相同&#xff0c;无放回则每轮抽取的结果都相同 在猫狗的例子中&#xff0c;我们使用”有放回抽样“来抽取10个样本&#xff0c;并组合为一个与原始数据集不同的新数据集&#xff0c;虽…

2.1_2 进程的状态与转换

2.1_2 进程的状态与转换 &#xff08;一&#xff09;进程的状态——创建态、就绪态 进程正在被创建时&#xff0c;它的状态是“创建态”&#xff0c;在这个阶段操作系统会为进程分配资源、初始化PCB。 当进程创建完成后&#xff0c;便进入“就绪态”&#xff0c;处于就绪态的进…

如何在Windows系统中检测和结束运行中的程序(任务管理器显示运行程序可能有bug)

如何在Windows系统中检测和结束运行中的程序 在Windows系统的日常使用和管理过程中&#xff0c;我们经常需要检测某个程序是否正在运行&#xff0c;并在必要时结束它。本文将详细介绍如何在Windows系统中检测运行中的程序&#xff0c;并提供多种方法来结束这些程序。 检测运行…

Vue思维导图,复习+预习,其中有些已经弃用了,下期总结下

1、学前了解 2、基础知识 3、组件相关语法 4、高级语法 5、compositionAPI 6、配套工具