代码编织梦想

对象的内存布局

HotSpot 虚拟机,对象在 堆内存 中的存储布局分为
对象头 header, 实例数据 Instance Data, 对齐填充 Padding

对象头 header
Mark Word - 对象运行时数据
哈希码 HashCode, GC分代年龄, 锁状态标志, 线程持有的锁,偏向线程ID,偏向时间戳等

类型指针 - 对象所属的类型信息

数组长度 - 如果对象是数组的话

实例数据 Instance Data
class 里的字段,父类定义的字段在子类定义的字段前面
HotSpot虚拟机可配置压缩字段空间,子类较窄的字段可以插入父类变量的空隙之中
+XX: CompactFields = true (默认 true)

对齐填充 Padding
HotSpot 虚拟机内存管理系统 对象起始地址是8字节的整数倍,对象头已经设计成8字节的整数倍,实例数据没有对齐的部分通过对齐填充来补全


对象的访问
java 程序通过栈上的 引用(reference) 来访问堆上的具体对象, 一般是通过 句柄 或 直接指针 来访问

句柄
java 堆中划分一块内存做 句柄池,栈中的 reference 存储的是对象的句柄地址,
句柄中包含了对象 实例数据 与 类型数据 的地址信息

直接指针
栈中的 reference 存储的是对象地址,对象里放置了类型数据的地址信息

----------------------------------------------------
JVM 内存模型
内存分为 堆,方法区,栈,本地方法栈,程序计数器
-------------------------

线程共享,用来存放对象实例及数组
OutOfMemoryError - 堆不够内存完成实例分配,并且堆无法再扩展时
1.通过参数让虚拟机在堆内存溢出的时候 Dump 出堆转储快照
-XX: +HeapDumpOnOutOf-MemeryError
2.通过内存映像分析工具(如 Eclipse Memory Analyzer),对 Dump
出来的堆转储快照进行分析,确认导致 OOM 的对象是否有必要,
如果是内存泄露(memory leak), 修改代码,及时释放
如果是内存溢出(memory overflow), 一方面检查堆大小配置(-Xmx -Xms),
看是否有调大的空间,另一方面检查代码,是否有某些对象没有及时释放,存储结构不合理的情况
-------------------------
方法区
线程共享,类型信息(类名,访问修饰符,字段描述,方法描述,常量池),常量,静态变量,即时编译器编译后的代码缓存等数据
jdk 1.7之前 Perm Space 永久代, JVM 自己的内存
jdk 1.8之后 元空间, 直接内存
OutOfMemoryError - 运行时产生大量的类填满方法区

运行时常量池
class 文件里有一项信息是 常量池表,用于存放编译期生成的各种字面量与符号引用
在类加载的时候,存放到方法区的运行时常量池
运行时也可以把新的常量放入池中,如 String.intern()

hotSpot 虚拟机 jdk6 以前 是方法区的一部分,和方法区一样放在永久代
-XX:PermSize
-XX:MaxPermSize
OutOfMemoryError - 当 运行时常量池 无法满足新的内存分配需求时

hotSpot 虚拟机 jdk7 把 运行时常量池 移到了 java 堆中
-Xmx
OutOfMemoryError - 当 运行时常量池 无法满足新的内存分配需求时
-------------------------

Java 虚拟机堆栈,跟线程对应,用来存储栈帧
栈帧在方法被调用的时候创建,用来存储局部变量表,操作数栈,动态连接和方法的返回地址等信息,
每个方法从被调用到执行完毕,都对应着虚拟机栈中的一个栈帧从入栈到出栈的过程
-------------------------
本地方法栈 - 与栈类似
HotSpot 虚拟机并不区分栈与本地方法栈
栈为虚拟机执行 java 方法服务
本地方法栈为虚拟机执行本地方法服务

-Xss 栈内存容量
局部变量表 存着 基本数据类型 和 对象引用

StackOverflowError
当线程请求的栈深度大于虚拟机所允许的栈深度时

OutOfMemoryError
当栈无法申请到足够的内存时
-------------------------
程序计数器
线程私有,当前线程所执行的字节码的行号指示器
----------------------------------------------------

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43820780/article/details/129631146

面试官:jvm运行时数据区包含哪几部分?作用是啥?-爱代码爱编程

JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图官方的介绍讲的很

说一下 jvm 运行时数据区-爱代码爱编程

说一下 jvm 运行时数据区? 运行时数据区包括堆、方法区、栈、本地方法栈、程序计数器。 1、堆 堆解决的是对象实例存储的问题,垃圾回收器管理的主要区域。 2、方法区 方法区可以认为是堆的一部分,用于存储已被虚拟机加载的信息,常量、静态变量、即时编译器编译后的代码。 3、栈 栈解决的是程序运行的问题,栈里面存的是栈帧,栈帧里面存的是局部变量表

JVM运行时数据区如何划分?-爱代码爱编程

写在前面 本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和文献引用请见100个问题搞定Java虚拟机 解答 JVM运行时数据区可划分为,程序计数器(PC寄存器),Java虚拟机栈,本地方法栈,方法区和堆。 其中方法区和堆属于线程之间共享的,程序计

JVM运行时数据区-爱代码爱编程

一: 运行时数据区的结构为:方法区、堆、虚拟机栈、本地方法栈、程序计数器。(前面两个是进程共享的,后面三个是线程私有的) JVM的每个线程都与操作系统的本地线程直接映射,先java线程创建后本地线程。 阿里的结构如下: 1、程序计数器(程序计数寄存器):它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器完成

JVM运行时数据区简介-爱代码爱编程

 JVM内存结构 一、程序计数器1.1 定义1.2 作用1.3 特点二、虚拟机栈2.1 定义2.2 作用2.3 特点三、本地方法栈3.1定义四、堆4.1 定义4.2 特点五、方法区5.1 定义5.2 具体实现 一、程序计数器 1.1 定义   程序计数器是一个记录着当前线程所执行的字节码的行号指示器,它记的是下一条JVM指令的执行地址。

JVM——运行时数据区域-爱代码爱编程

一、运行时数据区的结构    如上图,运行时数据区包括五个部分,红色区域多个线程共享,灰色区域每一个线程独占, 在java API ,一个java虚拟机就对应一个Runtime类,一个Runtime就对应一个运行时数据区。  1.1 程序计数器 程序计数器用来存储指向下一条指令的地址,也即将要执行的指令代码,由执行引擎读取下一条

JVM 运行时数据区中的故事(内存中的故事)-爱代码爱编程

这里我要提一嘴。这里讲的是java运行时数据区,也就是内存数据划分,分为几个数据区。不是java内存模型。这两不是一回事。java内存模型在后面并发那才会更新到。 本文主要是根据周志明老师 的《深入理解JVM》写的,其中添加了诸多自己的批注。图片来自尚硅谷的 JVM 教程。全文比较长,小三万字。本来打算拆分开来写的,但是它们都属于运行时数

Jvm - 详解一 运行时数据区-爱代码爱编程

一.为什么说Java是一门跨平台语言 Java内置JVM (java虚拟机),而JVM也是一个软件,不同的平台有不同的版本。我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件。Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们

JVM运行时数据区结构及原理-爱代码爱编程

目录 一、概述 二、程序计数器(PC寄存器) 三、虚拟机栈 四、本地方法栈 五、堆和方法区 一、概述 运行时数据区包括: 堆程序计数器虚拟机栈本地方法栈堆方法区运行时数据区内部结构: 下图红色区域(即堆和方法区):一个进程对应一份,一个进程可以有多个线程,即是线程共享的。JVM允许一个应用有多个线程并行执行 灰色区域(即PC、栈、本地

初识JVM(JVM运行流程,JVM运行时数据区,内存布局中的异常)-爱代码爱编程

目录 🚗一. JVM概述 🚓二. JVM的运行流程 🚕三. JVM运行时数据区(面试常考重点) 🛹1. 堆区(线程共享) 🛼2. 虚拟机栈(线程私有) 🚲3. 本地方法栈(线程私有)  🛵4. 程序计数器(线程私有) 🏍️5. 方法区/元数据区(线程共享) 🚙四. 内存布局中的异常 🛹1. 堆溢出 🛼2. 栈溢出 🚗一. JVM

jvm监控搭建-爱代码爱编程

文章目录 JVM监控搭建整体架构JolokiaTelegrafInfluxdbGrafana JVM监控搭建 整体架构 JVM 的各种内存信息,会通过 JMX 接口进行暴露。 Jolokia