当前位置: 首页 > news >正文

八股文--JVM(1)

⭐️⭐️JVM内存模型

  • 程序计数器:可以看作是当前线程所执行的字节码的行号指示器,用于存储当前线程正在执行的 Java 方法的 JVM 指令地址。如果线程执行的是 Native 方法,计数器值为 null。是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域,生命周期与线程相同。

  • Java 虚拟机栈:每个线程都有自己独立的 Java 虚拟机栈,生命周期与线程相同。每个方法在执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。可能会抛出 StackOverflowError 和 OutOfMemoryError 异常。

  • 本地方法栈:与 Java 虚拟机栈类似,主要为虚拟机使用到的 Native 方法服务,在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。本地方法执行时也会创建栈帧,同样可能出现 StackOverflowError 和 OutOfMemoryError 两种错误。

  • Java 堆:是 JVM 中最大的一块内存区域,被所有线程共享,在虚拟机启动时创建,用于存放对象实例。从内存回收角度,堆被划分为新生代和老年代,新生代又分为 Eden 区和两个 Survivor 区(From Survivor 和 To Survivor)。如果在堆中没有内存完成实例分配,并且堆也无法扩展时会抛出 OutOfMemoryError 异常。

  • 方法区(元空间):在 JDK 1.8 及以后的版本中,方法区被元空间取代,使用本地内存。用于存储已被虚拟机加载的类信息、常量、静态变量等数据。虽然方法区被描述为堆的逻辑部分,但有 “非堆” 的别名。方法区可以选择不实现垃圾收集,内存不足时会抛出 OutOfMemoryError 异常。

  • 运行时常量池:是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,具有动态性,运行时也可将新的常量放入池中。当无法申请到足够内存时,会抛出 OutOfMemoryError 异常。

  • 直接内存:不属于 JVM 运行时数据区的一部分,通过 NIO 类引入,是一种堆外内存,可以显著提高 I/O 性能。直接内存的使用受到本机总内存的限制,若分配不当,可能导致 OutOfMemoryError 异常。

1.程序计数器

线程私有的,内部保存的字节码的行号,用于记录正在执行的字节码指令的地址

2.Java堆

线程共享的区域:主要用来保存对象实例,数组等,当堆中没有内存空间可分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。

新生代(Young Generation):新生代分为Eden Space和Survivor Space。在Eden Space中, 大多数新创建的对象首先存放在这里。Eden区相对较小,当Eden区满时,会触发一次Minor GC(新生代垃圾回收)。在Survivor Spaces中,通常分为两个相等大小的区域,称为S0(Survivor 0)和S1(Survivor 1)。在每次Minor GC后,存活下来的对象会被移动到其中一个Survivor空间,以继续它们的生命周期。这两个区域轮流充当对象的中转站,帮助区分短暂存活的对象和长期存活的对象。

老年代(Old Generation/Tenured Generation):存放过一次或多次Minor GC仍存活的对象会被移动到老年代。老年代中的对象生命周期较长,因此Major GC(也称为Full GC,涉及老年代的垃圾回收)发生的频率相对较低,但其执行时间通常比Minor GC长。老年代的空间通常比新生代大,以存储更多的长期存活对象。

元空间(Metaspace):从Java 8开始,永久代(Permanent Generation)被元空间取代,用于存储类的元数据信息,如类的结构信息(如字段、方法信息等)。元空间并不在Java堆中,而是使用本地内存,这解决了永久代容易出现的内存溢出问题。

大对象区(Large Object Space / Humongous Objects):在某些JVM实现中(如G1垃圾收集器),为大对象分配了专门的区域,称为大对象区或Humongous Objects区域。大对象是指需要大量连续内存空间的对象,如大数组。这类对象直接分配在老年代,以避免因频繁的年轻代晋升而导致的内存碎片化问题。

圾回收主要指的就是堆内存

⭐️3.虚拟机栈

Java Virtual machine Stacks (java 虚拟机栈)---存储的局部变量和方法调用

  • 每个线程运行时所需要的内存,称为虚拟机栈,先进后出
  • 每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
  • 每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

不涉及垃圾回收,当栈帧出栈以后,内存就会释放

4.方法区/元空间

也是线程共享的内存区域:主要存储类的信息,运行时常量池

在 JDK 1.8 及以后的版本中,方法区被元空间取代,使用本地内存。用于存储已被虚拟机加载的类信息、常量、静态变量等数据。虽然方法区被描述为堆的逻辑部分,但有 “非堆” 的别名。方法区可以选择不实现垃圾收集,内存不足时会抛出 OutOfMemoryError 异常。

常量池

可以看作一个表,虚拟机指令根据这张常量表找到要执行的表名,方法名,参数类型,字面量等信息

5.直接内存

直接内存:并不属于JVM的内存结构,不由JVM进行管理,是虚拟机的系统内存,常见与NIO操作时,用于数据缓冲区,他分配回收成本较高,但读写性能高

相关文章:

  • 谷歌地图代理 | 使用 HTML 和矢量模式 API 更轻松地创建 Web 地图
  • SpringBoot常用注解详解
  • 码蹄集——圆包含
  • 芯片测试之X-ray测试
  • FC7300 GPT MCAL 配置引导
  • handsome主题美化及优化:10.1.0最新版 - 2
  • 分析主流编程语言中哪些为支持面向对象的语言
  • PHP 与 面向对象编程(OOP)
  • OM和SCADA的区别
  • Linux远程连接服务
  • Feign异步模式丢失上下文问题
  • 探索ISBN查询接口:为图书管理系统赋能
  • 三格电子上新了——IO-Link系列集线器
  • 1-10 目录树
  • 【控制波形如何COPY并无痛使用】
  • NocoBase 本周更新汇总:优化及缺陷修复
  • VSCode插件 —— 文心快码 BAIDU COMATE (免费!!)
  • 代码随想录第51天|岛屿数量(深搜)、岛屿数量(广搜)、岛屿的最大面积
  • windows编程中加载DLL的两种典型方式的比较
  • 内部检测实验室数字化转型新路径 质检LIMS系统如何实现合规、效率、资质三重突破?
  • 注册网站用的信用卡/网络推广员一个月多少钱
  • 专业的网站建设/移动建站模板
  • 免费做司考真题的网站/抖音广告
  • 用百度云服务器做网站/百家港 seo服务
  • 832网络销售平台/seo页面排名优化
  • 建立网站的英文怎么说/seo外链推广工具下载