图解JVM运行时数据区

图解JVM运行时数据区

前沿

 

Q1:为何要图解?

在我自己学习JVM的时候,啃过很多相关的书籍,但是总是不能形成一个长久的记忆。书上晦涩的词语即使当时记住了但是长久不用也会忘记。用图解的方式就是作者亲自使用的一种能帮助形成长久记忆的方法。(一图胜千言)

引用一段话

但是, 最重要的 还是 要 看到 它。 人类 是 一种 有 视觉 思想 的 动物。 眼睛 所 注视 的 印象 可以 经久不衰。 我们 经常 可以 记住 某 人的 脸, 即使 我们 记 不住 他的 姓名。 从 眼睛 通往 脑部 的 神经, 比 从 耳朵 通往 脑部 的 神经 要 大 25 倍。 中国 有 一句 格言“ 百 闻 不如 一见。”

戴尔·卡耐基(Carnegie.D.). 人性的弱点大全集(超值金版) (Kindle 位置 5681-5683). 立信会计出版社. Kindle 版本. 

 

知识前提

读者需要具备:

1.知道Java 是运行在JVM(Java Virtual Machine)

2.知道JVM是一个由C++编写的程序的概念(native 方法)

3.要知道java程序是如何运行的

知识点

  • JVM 运行时数据区
    • 方法区
    • 堆(堆外NIO)
    • 程序计数器
    • 虚拟机栈(VMStack)
    • 本地方法栈

JVM运行时数据区

运行时数据区

 

我们们可以按照 **数据** 和 **指令** 把JVM的运行数据区分为两块

数据用大白话讲就是存东西的,

例如Heap 存储了Java种的对象,数组

例如方法区存储了类信息(class)/ 常量()(1.7+有变化)/ 静态变量/ JIT (1.7以前)

下面一个一个来说

指令-虚拟机栈(VM Stack)

  • Stack

我们大学里学过数据结构,Stack

 

Stack(先进后出)

如果没理解,借用小时候用的这种塑料存钱钱罐就知道了(感觉挺形象的)

存钱筒

 

首先我们要知道一个线程(Thread)会对应一个栈(Stack)

栈的大小时多少呢?JDK1.7默认是 1mb

下面一个方法运行的例子对应的栈的变化是怎么样的

  • Stack Frames (栈帧) 

一个方法就代表一个栈帧,方法执行的时候,例:执行methodOne

就会压入到该线程(Thread,在一个线程中是顺序执行的)的栈中

若该 methodOne 调用,methodTwo 那么 methodTwo 就会压栈,

(根据栈的特性要mTwo 执行结束了出栈了mOne 才能继续执行)

标题

 

附IDEA中调试的栈信息GIF:

  • 栈帧中的参数介绍(只介绍了比较关键的几个)
    • 局部变量表

局部变量表是存储该栈帧中执行过程中数据的区域

java的基本数据类型 (byte char short int long float double boolean)是直接存在这里的,

(这一部分是存在堆(heap)外的,不通过GC 回收的)

java的对象和数组,是存在Heap里的,局部变量表中记录一个指向堆中对象的指针。

(引深:我们学GC的时候讲 强引用的时候看到这句话 ”被局部变量表中变量直接或者间接引用的对象都不会被回收“ 就是这个意思)

  • 栈帧中的参数介绍(只介绍了比较关键的几个)
    • 操作数栈
    • 动态链接
    • 出口

 ( java 栈和栈帧: https://www.cnblogs.com/minisculestep/articles/4934947.html)

指令-程序计数器

指向当前线程正在执行的字节码指令的地址  行号

指令-本地方法栈

natvie 方法用 c++ 实现

(引深:HashMap 的hash 算法就是先从 对象中调用这里的 native int hasCode();)

/**
 * 删除方法注释的Object类
 * Class {@code Object} is the root of the class hierarchy.
 * Every class has {@code Object} as a superclass. All objects,
 * including arrays, implement the methods of this class.
 *
 * @author  unascribed
 * @see     java.lang.Class
 * @since   JDK1.0
 */
public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
    //native 方法存于 本地方法栈
    public final native Class<?> getClass();
   //native 方法存于 本地方法栈
    public native int hashCode();

  ....
}

数据-方法区

https://blog.csdn.net/youngyouth/article/details/79933612

数据-堆

前面讲了,每个线程都对应一个虚拟机栈,对应一个程序计数器,

线程共享堆(Heap)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值