Java虚拟机(虚拟机内存分析)

时间:2022-12-29 09:10:14

java虚拟机是java程序员的操作系统,所以掌握java虚拟机对于java程序员来说很有必要。在接下来的时间里,我将重点总结和分析java虚拟机的相关知识。参看书籍选择《java虚拟机规范》和周志明老师的《深入理解java虚拟机》,这两本书是学习java虚拟机的必备书籍。

虚拟机内存分析

Java虚拟机(虚拟机内存分析)
如上图所示,java虚拟机内存分为方法区、堆内存、虚拟机栈、本地方法栈,程序计数器几个部分,下面分别介绍每个部分的作用。

程序计数器
程序计数器的作用是用来记录程序运行的行数,可以看作是当前线程所执行的字节码的行号指示器,字节码指示器通过修改这个计数器的值来改变下一条需要执行的字节码。分支、循环、条件语句的实现都依赖于这个程序计数器。
在进行多线程操作时,需要再不同的线程之间进行切换,实现不同线程的切换需要依赖程序计数器,为了使每条线程能够互不影响地执行,每个线程都拥有自己的程序计数器,所以程序计数器是“线程私有的”。


“堆”是一块非常重要的内存,所有的对象实例都存在于该区域,《java虚拟机规范》这样描述堆:所有的对象实例以及数组都要再堆上进行分配。“堆”也是垃圾收集器的重点工作区域,不再使用的对象实例都要被垃圾收集器清理。为了便于垃圾收集器管理,所以堆又可以分为“新生代”和“老年代”。无论如何划分,”堆“内所存储的都是对象实例和数组。进一步划分的主要目的是便于垃圾收集以及内存分配。

方法区
方法区同样属于”堆“。但方法区与”堆“又有所不同。方法区与java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译过的代码数据。方法区被称为”永久代“是因为该区域的数据不会被垃圾收集器回收。但这并不绝对,不同的虚拟机有不同的实现方式。

java虚拟机栈
java虚拟机栈是线程私有的。虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。存储局部变量表存放了编译器可知的各种数据类型(int, boolean, double, float, short, byte,char),对象引用类型等。

本地方法栈
本地方法栈与java虚拟机栈的作用相类似,不同之处在于java虚拟机栈为java方法服务,而本地方法栈为native方法服务。

每个内存区域都有其特定作用,java在运行的过程中,有不同的概念,比如对象实例、引用、静态变量、类信息所具备不同的功能,有的需要定期清理,有的需要被各个线程共享。java的不同作用决定了要分为不同的内存区域。但每个区域是如何配合运行的还需进一步学习。