烧点脑子使劲看--JVM运行时数据区详讲(上)

简介: Java虚拟机在执行程序的过程会把它管理的内存划分为若干个不同的数据区。这些数据区有些是随着虚拟机进程的启动而一直存在的,有些区域则是依赖线程的启动和结束而创建和销毁的。

一、概述


Java虚拟机在执行程序的过程会把它管理的内存划分为若干个不同的数据区。这些数据区有些是随着虚拟机进程的启动而一直存在的,有些区域则是依赖线程的启动和结束而创建和销毁的。

网络异常,图片无法展示
|


二、程序计数器


程序计数器可以看做是当前线程所执行的字节码的行号指示器,在Java虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来读取下一条需要执行的字节码指令。如果当前线程正在执行的是一个Java方法,这个计数器记录的值就是正在执行的字节码指令地址,如果是在执行本地方法,这个计数器的值为空(Undefined)。值得注意的是,这块区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域。


三、Java虚拟机栈


Java虚拟机栈就是我们常说的堆栈,这块区域也是线程私有的。虚拟机栈描述的是Java方法执行的线程内存模型:当一个方法被执行时,虚拟机栈会创建一个栈帧,这个栈帧储存了局部变量表、操作数栈、动态链接、方法返回地址等信息,当方法执行完成时,栈帧出栈。

局部变量表储存了编译时期可以确定的各种基本数据类型 ( boolean, byte, char, short, int, float)、对象引用(reference)和returnAddress类型(指向下一条字节码指令的地址)。这些数据类型在局部变量表中以局部变量槽(Slot)来表示,long和double类型会占用两个Slot。 局部变量表所需要的空间是在编译时就确定的,当调用一个方法时,这个方法需要多大的局部变量表空间是完全确定的。

在《Java虚拟机规范》中规定了这个区域的两种异常情况:

  • If the computation in a thread requires a larger Java Virtual Machine stack than is permitted, the Java Virtual Machine throws a StackOverflowError.
  • If Java Virtual Machine stacks can be dynamically expanded, and expansion is attempted but insufficient memory can be made available to effect the expansion, or if insufficient memory can be made available to create the initial Java Virtual Machine stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.

如果线程请求的虚拟机栈深度超过虚拟机所允许的深度,将抛出StackOverflowError异常。如果虚拟机栈容量动态扩展时申请不到足够的内存将抛出OutOfMemoryError异常。

注:Hotspot虚拟机的栈容量不可以动态扩展,不会因为动态扩展内存不足OOM,但线程申请栈空间时,如果内存不足,还是会OOM。

目录
相关文章
|
1天前
|
监控 算法 Java
Java虚拟机(JVM)使用多种垃圾回收算法来管理内存,以确保程序运行时不会因为内存不足而崩溃。
【6月更文挑战第20天】Java JVM运用多种GC算法,如标记-清除、复制、标记-压缩、分代收集、增量收集、并行收集和并发标记,以自动化内存管理,防止因内存耗尽导致的程序崩溃。这些算法各有优劣,适应不同的性能和资源需求。垃圾回收旨在避免手动内存管理,简化编程。当遇到内存泄漏,可以借助VisualVM、JConsole或MAT等工具监测内存、生成堆转储,分析引用链并定位泄漏源,从而解决问题。
10 4
|
3天前
|
算法 Java
Java垃圾回收(Garbage Collection,GC)是Java虚拟机(JVM)的一种自动内存管理机制,用于在运行时自动回收不再使用的对象所占的内存空间
【6月更文挑战第18天】Java的GC自动回收内存,包括标记清除(产生碎片)、复制(效率低)、标记整理(兼顾连续性与效率)和分代收集(区分新生代和老年代,用不同算法优化)等策略。现代JVM通常采用分代收集,以平衡性能和内存利用率。
30 3
|
22天前
|
监控 Java 测试技术
滚雪球学Java(45):探秘Java Runtime类:深入了解JVM运行时环境
【5月更文挑战第20天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
19 1
滚雪球学Java(45):探秘Java Runtime类:深入了解JVM运行时环境
|
9天前
|
存储 缓存 安全
JVM(三)-运行时数据区(栈、程序计数器)
JVM(三)-运行时数据区(栈、程序计数器)
12 2
|
18天前
|
存储 Java 编译器
【JavaEE初阶】 JVM 运行时数据区简介
【JavaEE初阶】 JVM 运行时数据区简介
|
23天前
|
Java Linux
JVM堆内存诊断
JVM堆内存诊断
21 0
|
9天前
|
算法 安全 Java
JVM系列4-垃圾收集器与内存分配策略(二)
JVM系列4-垃圾收集器与内存分配策略(二)
18 0
JVM系列4-垃圾收集器与内存分配策略(二)
|
15天前
|
存储 Java
JVM内存结构(4)
JVM内存结构
15 1
|
9天前
|
存储 监控 算法
【JVM】如何定位、解决内存泄漏和溢出
【JVM】如何定位、解决内存泄漏和溢出
24 0
|
9天前
|
存储 监控 算法
JVM系列4-垃圾收集器与内存分配策略(一)
JVM系列4-垃圾收集器与内存分配策略(一)
18 0