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


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


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

    线程独享数据区

    PC寄存器

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

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

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

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

    java虚拟机栈

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

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

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

    局部变量表:

    局部变量的列表。

    操作数栈:

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

    动态链接:

    指向常量池的引用。

    方法出口:

    负责回复调用者。

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

    本地方法栈

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

    线程共享数据区

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

    方法区

    用于存储类的结构信息。

  • 相关阅读:
    Linux下挂载新硬盘
    远程编写+调试服务器上的Python程序
    记一次CUDA编程任务
    CUDA核函数调用基础数学API的一个奇葩情况
    Python多线程常用包对比
    Python threadpool传递参数
    代码生成器
    从移动优先到离线优先(三)
    从移动优先到离线优先(二)
    从移动优先到离线优先(一)
  • 原文地址:https://www.cnblogs.com/wxdmw/p/13691266.html
Copyright © 2020-2023  润新知