JVM知识点总结二

参考文章:【Java面试题汇总】JVM篇(2023版)_jvm面试题2023-CSDN博客

1、说说你了解的JVM内存模型:

**JVM由三部分组成:**类加载子系统、运行时数据区、执行引擎

JVM内存模型:

内存模型里的运行时数据区:

  • 类加载子系统:根据给定的全限定名类名(如:java.lang.Object)来装载class文件到运行时数据区中的方法区中。

  • **执行引擎:**根据程序计数器中存储的字节码指令解释/编译为对应平台上的本地机器指令。

  • 运行时数据区: 又分为堆、方法区、虚拟机栈、本地方法栈、程序计数器 。**方法区和堆是线程之间共享的内存区域,**而虚拟机栈、本地方法栈、程序计数器则是线程私有的,就是说每个线程都有自己的这个区域。

  • 程序计数器:线程私有的,是一块很小的内存空间,作为当前线程的行号指示器,用于记录当前虚拟机正在执行的线程指令地址;

  • 虚拟机栈:线程私有的,一个线程一个栈,一个栈又是由一个个栈帧组成,每个栈帧都对应一次方法的调用,每个方法执行的时候都会创建一个栈帧,用于存储局部变量表(存方法参数和局部变量)、操作数栈(存方法执行过程中的中间结果,或者其他暂存数据)、动态链接和方法返回地址等信息,当线程请求的栈深度超过了虚拟机允许的最大深度时,就会抛出StackOverFlowError;

  • 本地方法栈:线程私有的,保存的是native方法的信息,当一个jvm创建的线程调用native方法后,jvm不会在虚拟机栈中为该线程创建栈帧,而是简单的动态链接并直接调用该方法;

  • 堆: java堆是所有线程共享的一块内存,包括新生代(伊甸园区、幸存区S0和S1)和老年代,几乎所有对象的实例和数组都要在堆上分配内存,因此该区域经常发生垃圾回收的操作;

  • 方法区: 方法区是所有线程共享的一块内存,存放已被加载的类信息、方法信息、常量、静态变量、即时编译器编译后的代码数据。 即永久代,在jdk1.8中不存在方法区了,被元数据区替代了,原方法区被分成两部分: 1、加载的类信息,2、运行时常量池;加载的类信息被保存在元数据区中,运行时常量池保存在堆中;

​​​​​​​

Java对象结构

Java对象由三个部分组成:对象头、实例数据、对齐填充。

对象头由两部分组成,第一部分存储对象自身的运行时数据:哈希码、GC分代年龄、锁标识状态、线程持有的锁、偏向线程ID(一般占32/64 bit)。第二部分是指针类型,指向对象的类元数据类型(即对象代表哪个类)。如果是数组对象,则对象头中还有一部分用来记录数组长度。

实例数据用来存储对象真正的有效信息(包括父类继承下来的和自己定义的)

对齐填充:JVM要求对象起始地址必须是8字节的整数倍(8字节对齐)

相关推荐
黄雪超5 小时前
JVM——JVM是怎么实现invokedynamic的?
java·开发语言·jvm
诺亚凹凸曼17 小时前
Java并发编程-多线程基础(三)
java·开发语言·jvm
Zz_waiting.1 天前
JVM 一文详解
java·jvm·java-ee
不太可爱的叶某人2 天前
【学习笔记】深入理解Java虚拟机学习笔记——第1章 走进Java
java·jvm·笔记·学习
predisw2 天前
垃圾收集GC的基本理解
java·jvm·算法
黄雪超2 天前
JVM——JVM 是如何执行方法调用的?
java·开发语言·jvm
不太可爱的叶某人2 天前
【学习笔记】深入理解Java虚拟机学习笔记——第2章 Java内存区域与内存溢出异常
java·jvm·笔记·学习
振鹏Dong3 天前
JVM性能调优的基础知识 | JVM内部优化与运行时优化
jvm
碎梦归途3 天前
23种设计模式-行为型模式之状态模式(Java版本)
java·jvm·设计模式·状态模式·软考·软件设计师·行为模式
bing_1583 天前
如何进行 JVM 性能调优?
jvm·测试工具·性能调优