【JVM】运行时数据区域,内存如何分配和对象在内存中的组成

目录

一.运行时数据区域

1.线程独享

2.线程共享

二.内存如何分配

1.指针碰撞法

2.空闲列表法

3.TLAB

三.对象在内存中的组成

​编辑1.对象头

2.实例数据

3.对齐填充


一.运行时数据区域


1.线程独享


(1)栈
虚拟机栈:每个 Java 方法在执行的同时,会创建一个栈帧,用于存储局部变量表、操作数栈、常量池引用等信息;方法的调用过程,就是一个栈帧在 Java 虚拟机栈中入栈和出栈的过程;
本地方法栈:和虚拟机栈很类似,区别在于虚拟机栈为 Java 方法服务,本地方法栈为 Native 方法服务;其中 Native 方法可以看做用其它语言(C、C++ 或汇编语言等)编写的方法;
(2)程序计数器
      一个 CPU 在某个时间点,只能做一件事情,在多线程的情况下,CPU 运行时间被划分成若干个时间片,分配给各个线程执行;
程序计数器的作用就是记录当前线程执行的位置,当线程被切换回来的时候,能够找到该线程上次运行到哪儿了;所以程序计数器一定是线程隔离的。

2.线程共享


(1)方法区
方法区用于存放已被加载的类信息、常量、静态变量、即编译器编译后的代码等。
还有要注意的一点:方法区是 JVM 的规范,在 JDK 1.8 之前,方法区的实现是永久代;从 JDK 1.8 开始 JVM 移除了永久代,使用本地内存来存储元数据并称之为:元空间(Metaspace)。

(2)堆
对于堆栈的区别总结一句话:堆中存对象,栈中存基本数据类型和堆中对象的引用;一个对象的大小是可以动态变化的,而引用是固定大小的。
这么看就容易理解堆为什么是线程公有的了,省地儿啊

二.内存如何分配


1.指针碰撞法


适用于堆内存完整的情况,已分配的内存和空闲内存分表在不同的一侧,通过一个指针指向分界点,当需要分配内存时,把指针往空闲的一端移动与对象大小相等的距离即可,用于Serial和ParNew等不会产生内存碎片的垃圾收集器。

2.空闲列表法


适用于堆内存不完整的情况,已分配的内存和空闲内存相互交错,JVM通过维护一张内存列表记录可用的内存块信息,当分配内存时,从列表中找到一个足够大的内存块分配给对象实例,并更新列表上的记录,最常见的使用此方案的垃圾收集器就是CMS。

3.TLAB


三.对象在内存中的组成


1.对象头


(1)markword
记录了该对象锁相关的信息、分代年龄、hashCode,在32位JVM中占32bit,在64位JVM中占64bit

(2)指向类型的指针
指向方法区对应class信息的指针,在32位JVM中占32bit,在64位JVM中占64bit(开启指针压缩的情况下占32bit)

(3)如果是数组-》数组长度
如果是数组的话,组成中会包含数组长度,32bit

2.实例数据


类的实例信息

3.对齐填充


JVM要求Java对象的大小应该是8bit的倍数,这部分就是将对象大小补充为8bit的倍数
 

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

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

相关文章

熟人免疫算法优化复杂网络(MATLAB)

熟人免疫算法是一种用于优化复杂网络的进化算法。它通过模拟熟人关系和免疫机制的思想来改进网络的性能。该算法首先随机生成一组个体作为初始种群,然后通过计算每个个体的适应度值来评估其优劣。接下来,通过选择、交叉和变异等操作,不断迭代…

关于Spring Boot和MyBatis常见的十道面试题

拦截器和过滤器有什么区别? 拦截器(Interceptor)和过滤器(Filter)都是用于在请求道道目标资源的之前或之后进行处理的组件。主要区别有以下几点: 依赖对象不同:过滤器是来时Servlet&#xff0…

c语言常量详解 全

c语言常量详解 全 一 常量的基本概念及分类二 常量的存储方式三 c语言常量和变量的具体区别四 字面常量详解4.1 常见类型的字面常量及其示例:4.2 字面常量的使用情况4.3 字面常量的优点 五 const 关键字常量详解5.1 const关键字在C语言中的使用情况:5.2 …

温酒读Qt:QObject中篇2 ——欲遮还羞的 QObjectPrivate

《妙法莲华经》曰:“佛道长远,久受勤苦,乃可得成。” 世事修炼,莫不如是,日拱一卒无有尽,功不唐捐终入海。 传送门: 《温酒读Qt:QObject 序篇》 《温酒读Qt:QObject中篇1—— Q_OBJ…

设计模式——模板方法模式(Template Method Pattern)

概述 模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法模式是一种基于继承的代码复用技术,它是一种类行为型模式。模板方法模式是结…

Android中下载 HAXM 报错 Intel® HAXM installation failed,如何解决?

最近在搭建 Flutter 环境,但是在 Android Studio 中安装 Virtual Device 时,出现了一个 问题 Intel HAXM installation failed. To install Intel HAXM follow the instructions found at: https://github.com/intel/haxm/wiki/Installation-Instructio…

1.25时间序列分析,FB先知模型、简要傅里叶变化解决周期性变化,实例步骤

目录 FB概念 ​编辑 GEOGEBRA可视化傅里叶​编辑 先知模型步骤 财务数据要考虑到可解释性 FB模型概念 可以用傅里叶级数来描述周期性变化的因素 GEOGEBRA可视化傅里叶 先知模型步骤

安装好IntelliJ IDEA点击无反应,如何解决配置文件不一致导致的启动问题

在我们的开发生涯中,遇到IDE工具出现问题是在所难免的。最令人头疼的莫过于,你的IDEA(IntelliJ IDEA)无法启动,而且没有任何错误提示。这篇文章将详细讲解如何解决IntelliJ IDEA 2023.3.3版本启动失败的问题,这个问题可能也适用于…

如何让wordpress首页只显示某一篇文章全部内容?在您的主页显示选择

大多数WordPress站点首页默认都是显示最新发布的文章列表,不过有些站点比较特殊,只想显示某一篇文章的全部内容,那么应该怎么设置呢? 其实,WordPress后台 >> 设置 >> 阅读 >> 在“您的主页显示”中…

OpenHarmony RK3568 启动流程优化

目前rk3568的开机时间有21s,统计的是关机后从按下 power 按键到显示锁屏的时间,当对openharmony的系统进行了裁剪子系统,系统app,禁用部分服务后发现开机时间仅仅提高到了20.94s 优化微乎其微。在对init进程的log进行分析并解决其…

解决Linux环境下gdal报错:ERROR 4: `/xxx.hdf‘ not recognized as a supported file format.

网上查了一堆资料,五花八门,总结了一下可能的原因: ① gdal不支持该格式 使用命令“gdalinfo --formats” 即可查看当前环境中的gdal所能支持的数据格式。如下图(没截完整,下面还有一大串)。 这个是很常见…

分布式虚拟文件系统,如何实现多种存储系统的融合

随着大数据技术和人工智能技术的发展,各种框架应运而生,比如大数据领域中的MapReduce和Spark,人工智能领域中的TensorFlow和PyTorch等。为了给不同的计算框架提供存储服务,存储的服务类型也是很多,常见的如AWS的S3存储…