深入理解JVM之内存结构(栈,堆划分)

一、JVM的整体流程

在这里插入图片描述
JVM在运行过程中会把它所管理的内存划分成若干不同的数据区域!

  1. 线程私有:程序计数器、虚拟机栈、本地方法栈
  2. 线程共享:堆、方法区
    在这里插入图片描述

二、线程私有

  1. 程序计数器
    指向当前线程正在执行的字节码指令的地址(行号),JVM里面唯一不会发生OOM的区域。
    java是多线程,为了记录线程之间的切换。确保在多线程的情况下能正常执行。
  2. 本地方法栈
    其实就是native方法调用了jni层。例如:Object.hashCode();该方法就是调用了native方法
  3. 虚拟机栈
    每个线程私有的,线程在运行时,在执行每个方法的时候都会打包成一个栈帧,存储了局部变量表,操作数栈,动态链接,方法出口等信息,然后放入栈。每个时刻正在执行的当前方法就是虚拟机栈顶的栈桢。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程。
    局部变量:其实就是存储了方法里的局部变量。
    操作数栈:其实就是我们在方法方法里面所操作的代码,相当于是一个栈,操作的元素在栈里一直运行入栈/出栈的操作。
    动态链接:就是java的多态
    方法出口(返回地址):结果返回

例子:

public class JavaStack {
    public void king(int money){
        money = money -100; 
     }
    public static void main(String[] args)throws Throwable {
        JavaStack javaStack = new JavaStack();
        javaStack.king(10000);
    }
}

在命令行里面输入:javap -c -v JavaStack.clss > a.txt
重定向输出一个反编译的文件,这个文件其实就是king方法里面的一个虚拟机栈的操作流程

public void king(int);
    descriptor: (I)V
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: iload_1
         1: bipush        100
         3: isub
         4: istore_1
         5: return
      LineNumberTable:
        line 11: 0
        line 12: 5
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       6     0  this   Lcom/jvm/ch01/JavaStack;
            0       6     1 money   I

我这边通过图来分析:
在这里插入图片描述
这一节只介绍线程私有的,下一节在仔细分析线程共享,深入理解JVM之堆内存(年经代,老年代)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值