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字节对齐)

相关推荐
二十七剑1 小时前
jvm调试和查看工具
java·linux·jvm
李长渊哦13 小时前
常用的 JVM 参数:配置与优化指南
java·jvm
数巨小码人17 小时前
QT SQL框架及QSqlDatabase类
jvm·sql·qt
martian6651 天前
【Java高级篇】——第16篇:高性能Java应用优化与调优
java·开发语言·jvm
李长渊哦1 天前
Java 虚拟机(JVM)方法区详解
java·开发语言·jvm
二十七剑2 天前
jvm中各个参数的理解
java·jvm
七禾页话2 天前
垃圾回收知识点
java·开发语言·jvm
小梁不秃捏3 天前
深入浅出Java虚拟机(JVM)核心原理
java·开发语言·jvm
xiaolingting3 天前
JVM层面的JAVA类和实例(Klass-OOP)
java·jvm·oop·klass·instanceklass·class对象
神仙别闹3 天前
基于Python+Sqlite实现的选课系统
jvm·python·sqlite