Java学习---JVM(1)

JVM,即Java虚拟机,其是Java程序的运行环境,是Java技术的核心组成部分,本次就JVM的自动内存管理详细展开:

JVM的内存区域分为2大类,即线程私有的和线程共享的,前者分为3大块,虚拟机栈、本地方法栈、程序计数器。后者分为2大块,堆与方法区。

首先是私有的3大块区域:

1、程序计数器:程序计数器是一个较小的内存区域,其用于记录当前线程所执行的字节码指令的地址。每一个线程都有一个自己的程序计数器,其可以使线程切换时,快速的恢复到正确的执行位置。程序计数器的划分和管理是实现JVM高效运行和内存管理的基础。

2、虚拟机栈:其生命周期与线程一样,在创建线程时,会自动创建一个虚拟机栈,在每个方法在执行时,都会创建一个栈帧,其用于存储局部变量表、操作数栈、动态链接和方法出口等信息。每一个方法调用时,这个栈帧就会入栈,方法结束时,则会出栈。即每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。

不过,值得注意的是,在虚拟机栈中局部变量表部分中, 放了编译期可知的各种Java虚拟机基本数据类型(boolean、bytechar、short、int、 float、long、double)、对象引用(reference),它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。。这些数据类型在局部变量表中的存储空间以局部变量槽(Slot)来表示,其中64位长度的long和double类型的数据会占用两个变量槽,其余的数据类型只占用一个。

3、本地方法栈:其与虚拟机栈功能接近,只不过其是为虚拟机使用到的本地方法服务。

然后是线程共享的2个区域:

1、堆:堆是JVM管理的内存中最大的一块,其主要作用是存放对象实例和数组。堆也是垃圾收集器管理的内存区域,所以通常会被进一步划分为新生代、老年代、永久代等。不过无论从什么角度,无论如何划分,都不会改变堆中存储内容的共性,无论是哪个区域,存储的都只能是对象的实例,将堆细分的目的只是为了更好地回收内存,或者更快地分配内存。

2、方法区:其用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。

相关推荐
后端AI实验室2 小时前
用AI写代码,我差点把漏洞发上线:血泪总结的10个教训
java·ai
程序员清风4 小时前
小红书二面:Spring Boot的单例模式是如何实现的?
java·后端·面试
belhomme4 小时前
(面试题)Redis实现 IP 维度滑动窗口限流实践
java·面试
Be_Better4 小时前
学会与虚拟机对话---ASM
java
开源之眼6 小时前
《github star 加星 Taimili.com 艾米莉 》为什么Java里面,Service 层不直接返回 Result 对象?
java·后端·github
Maori3167 小时前
放弃 SDKMAN!在 Garuda Linux + Fish 环境下的优雅 Java 管理指南
java
用户908324602738 小时前
Spring AI 1.1.2 + Neo4j:用知识图谱增强 RAG 检索(上篇:图谱构建)
java·spring boot
小王和八蛋8 小时前
DecimalFormat 与 BigDecimal
java·后端
beata8 小时前
Java基础-16:Java内置锁的四种状态及其转换机制详解-从无锁到重量级锁的进化与优化指南
java·后端
IT探险家8 小时前
你的第一个 Java 程序就翻车?HelloWorld 的 8 个隐藏陷阱
java