什么是JVM
JVM,或叫Java虚拟机(Java Virtual Machine),是Java平台的一部分,它是一个用于执行Java字节码的虚拟计算机。
Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码字节码。
如下图所示:
简单来说JVM是用来解析和运行Java程序的,提供了许多功能,例如:垃圾回收、内存管理、安全性和线程管理等。
JVM的体系结构
JVM体系结构,如下图所示:
包含:JVM堆、虚拟机栈、程序计数器、Java方法区、本地方法栈。
1.JVM堆(Heap)
堆是Java应用程序中最重要的内存区域之一,其中包括对象的实例数据,例如类的字段和对象引用。
在堆中分配内存,对象的生命周期,由垃圾回收器来管理。
2.JVM方法区(Method Area)
方法区是用来存储类的元数据信息、静态变量、常量池、类的字节码等信息的内存区域。
Java 8之前,方法区是永久代(Permanent Generation),但在Java 8后,方法区被替换为元数据区(Metaspace)。
3.Java虚拟机栈(Java Virtual Machine Stacks)
虚拟机栈是每个线程私有的内存区域,用于存储方法调用的局部变量、操作数栈、方法返回地址以及异常处理信息。
虚拟机栈是用来执行方法的,每个方法调用都会创建一个栈帧,栈帧包含方法的参数、局部变量和操作数栈。
4.程序计数器(Program Counter Register)
程序计数器是每个线程私有的内存区域,用于存储当前线程正在执行的字节码指令的地址。
程序计数器通常用于顺序执行字节码指令,是线程私有的。
5.本地方法栈(Native Method Stacks)
本地方法栈与虚拟机栈一样是线程私有的,用于支持Java程序与本地代码(如C或C++编写的代码)的交互。
JVM垃圾回收算法
JVM使用不同的垃圾回收算法来管理内存中的对象,主要包含:标记-清除算法、
1.标记清除算法
这是最早的垃圾回收算法之一,它分为两个阶段:标记(Mark)和清除(Sweep)。
如下图所示:
首先,它标记所有存活的对象,然后清除未标记的对象。
这个算法的主要问题是内存碎片化,会导致空间浪费和性能问题。
2.复制算法
复制算法步骤,主要分为如下步骤:
第一步:标记出所有的存活对象
从根集合节点进行扫描,例如:线程栈中的对象、静态变量、寄存器中的指针等,标记出所有的存活对象,
第二步:复制对象到新内存
找出所有仍然存活的对象,并将这些存活的对象复制到一块儿新的内存。
如下图所示:
它将存活对象从一个区域复制到另一个区域,并清除非存活对象,这样可以解决内存碎片问题,但需要额外的内存空间。
3.标记整理算法
这个算法结合了标记和清除以及复制算法的优点。
首先,它标记存活对象,然后将它们压缩到一起,清除未标记的对象。这有助于减少内存碎片,并且不需要额外的内存空间。
如下图所示:
4.分代收集算法
这个算法将堆分为不同的代,通常分为新生代和老年代。
大多数对象在短时间内变得不可达,因此新生代使用复制算法来回收,而老年代使用标记-整理算法,这种分代回收策略可以提高垃圾回收的效率。
JVM总结
JVM是Java平台的核心组件,负责执行Java程序,提供了跨平台性、内存管理、垃圾回收和性能优化等关键功能。
1.跨平台性
JVM的核心特点之一是跨平台性,Java程序被编译成字节码(bytecode),这些字节码可以在任何装有适当JVM的平台上运行。
2.内存管理
JVM负责内存管理,包括内存分配、垃圾回收和内存释放,JVM自动分配和回收内存,从而防止内存泄漏和提高程序的稳定性。
3.垃圾回收
JVM内置了垃圾回收器,负责回收不再使用的内存,垃圾回收可以大大减轻程序员的负担,因为它自动管理内存释放,而无需手动释放对象。
4.安全性
JVM提供了安全性特性,可以保护程序免受恶意代码执行和内存越界访问的威胁。这包括安全沙箱和字节码验证。
5.垃圾回收器
JVM有多种垃圾回收器,每个回收器都有不同的优点和适用场景,Java开发人员可以根据应用程序需求选择合适的垃圾回收器。
陈睿mikechen
十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》