JVM底层
- Java虚拟机内存模型
- JVM组成部分
- 五大内存区域各自的作用
- 虚拟机栈(线程栈)
- 本地方法栈
- 程序计数器
- 为什么jvm要设计程序计数器?
- 堆
- 方法区
Java虚拟机内存模型
- JVM跨平台原因
就是在JVM层面对各个操作系统的指令做了不同处理
JVM组成部分
五大内存区域各自的作用
虚拟机栈(线程栈)
每次运行的时候,都会给线程栈分配一部分内存,有多少个线程就分配多少个。来存放各自线程运行时的变量,说白了就是工作内存,工作内存哪里来的就是虚拟机栈中分配来的
一个方法对应一个栈帧内存区域,
本地方法栈
方法执行到了本地方法,本地方法执行也需要内存空间,就从本地方法栈中分配一部分给本地方法。本地方法就是naitve修饰的方法(底层是C++)
程序计数器
某行程序在方法区中的内存地址
为什么jvm要设计程序计数器?
比如上面的程序,如果是多线程情况下,A线程执行到第4行的时候,被其他线程抢占资源,其他线程执行,其他线程完毕,A线程再回头执行,如果没有程序计数器,它就不知道它之前执行到第几行,就得重新执行,有了程序计数器,A线程一看,我之前执行到第4行,现在就从第4行开始再执行。
堆
如果栈中存放的是变量是对象也就是引用类型的变量,那栈中存放的就是指向对象的指针,对象就存放在堆中,所有线程共享
方法区
存放常量+静态变量+类信息
方法区中存放的静态变量是引用类型的,那么方法区中存的即使静态引用变量的指针,对象还是存放到堆中。