初探JVM------内存布局

之前学java时也听过JVM这个名字,但对它的了解仅限于很简单基础的少量概念,最近由于技术菜引发的中度持续性焦虑,令我开始将目光聚集在互联网上技术大佬的博客。机缘巧合之下,找到了一套讲解JVM的系列文章,貌似并不是很长,预计学习成本并不高,正好借此机会对JVM进行更深入的了解,在学习的同时整理出一套自己的学习笔记,记录一下自己的学习过程,同时也是为了以免过段时间大脑数据丢失。


 
之前提到java内存模型只知道栈、堆、常量池,文章中讲到这种方法是一种较为粗略的划分。
java的内存划分主要包括:虚拟机栈、本地方法栈、PC寄存器、方法区、堆区
看不懂,暂时略过,估计后面会详细介绍~~~
然后文章又说道,这些数据区域中大致可以划分为2类:线程独享、线程共享。
这个让我想到了之前看过一个视频讲过线程的本地内存和主内存,我猜测这里大概说的也是这个意思,独享的内存和共享的内存。
 
线程共享数据区包括方法区和堆区,随着虚拟机启动而建立,退出而销毁,为进程所有的子线程共享。
线程独享数据区包括虚拟机栈、本地方法栈、PC寄存器。这些数据区与线程对应,随着线程开始和结束而创建和销毁,线程都有自己私有的这三种数据区。
 
读到这两个概念让我想起了线程是进程的进一步划分,占用进程的内存资源,结合这两条概念,也就是在创建线程时,需要为线程分配内存,而线程会将自己的内存进一步划分为不同的数据区。

线程独享数据区

PC寄存器

首先,作者在文章中介绍到了java虚拟机是支持多线程的,每一个线程都有自己的PC寄存器,在任意时刻,一个线程只会执行一个方法的代码,正在被线程执行的方法称为线程的当前方法。

到目前为止都比较好理解,然后就提出了一些我比较陌生的概念。

当前方法不为native时,也就是非本地方法,PC寄存器的作用就是存储它经JVM汇编后字节码指令的地址,否则存储的值为undefined。

记得学习java之初就接触过,java的代码并不能直接执行,而是要经过编译为字节码然后执行(后期又接触到貌似字节码还要变为机器码,而字节码也是实现跨平台的关键,大概是一种中间语言?),之后也偶尔接触到了一点字节码指令,所以文章中的这一段也不算难理解。

java虚拟机栈

 java虚拟机栈的元素称为栈帧,栈帧在线程调用方法时被创建,用于存储局部变量表、操作栈、动态链接、方法出口等信息。

方法被调用,栈帧入栈,方法调用完成,栈帧出栈。

java虚拟机栈的生命周期与线程相同。

局部变量表:

局部变量的列表。

操作数栈:

供计算使用(让我想起了之前接触到的一道有关自增运算的java基础题)。

动态链接:

指向常量池的引用。

方法出口:

负责回复调用者。

在一条线程之中,只有目前正在执行的方法的栈帧是活动的。这个栈帧就被称为是当前栈帧,这个栈帧对应的方法就被称为是当前方法,定义这个方法的类就称作当前类。

本地方法栈

一般在线程创建时按线程分配,用于存储线程调用本地方法时,本地方法的局部变量表、操作数栈等信息。

线程共享数据区

是所有线程共享的内存区域,用于存放对象实例,在虚拟机启动时创建。

方法区

用于存储类的结构信息。

原文地址:https://www.cnblogs.com/wxdmw/p/13691266.html