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

相关推荐
zh1570235 小时前
JavaScript中WorkerThreads解决服务端计算瓶颈
jvm·数据库·python
2401_871492856 小时前
Vue.js监听器watch利用回调函数处理级联下拉框数据联动
jvm·数据库·python
zhoutongsheng8 小时前
C#怎么实现Swagger文档 C#如何在ASP.NET Core中集成Swagger自动生成API文档【框架】
jvm·数据库·python
gmaajt11 小时前
Golang怎么做国际化多语言_Golang i18n教程【核心】
jvm·数据库·python
maqr_11011 小时前
CSS如何利用Sass定义全局阴影方案_通过变量实现统一CSS风格
jvm·数据库·python
m0_6138562911 小时前
uni-app怎么做类似于美团的商家评价星级 uni-app五星评分组件制作【实战】
jvm·数据库·python
2401_8330336212 小时前
如何修复固定定位头部容器中悬浮下拉菜单的错位问题
jvm·数据库·python
z44247532612 小时前
CSS Grid布局如何实现网格项目的自动增长_设置grid-auto-flow- row
jvm·数据库·python
m0_7403524212 小时前
如何在 SvelteKit 中为动态加载的图片实现响应式悬停覆盖层
jvm·数据库·python
gmaajt13 小时前
JavaScript中闭包对垃圾回收器GC标记清除算法的影响
jvm·数据库·python