JVM 是一个虚拟机,相当于一个翻译软件,能够屏蔽掉我们对于操作系统和硬件设备的感知,从而实现“跨平台”
二、JVM的组成1.类加载器 (和类加载相关)
2.执行引擎(解释执行字节码)
3.动态内存管理器(和垃圾回收相关)
JVM的内存来自于操作系统,JVM启动之后就会从操作系统申请一大块内存,再针对这个内存划分出一些区域。划分成的区域如下:
1.堆(运行时常量池,在1.8中也是堆)
- 构造的对象存放在堆中
2.方法区
- 加载好的类
- 静态成员
3.栈(JVM栈/本地方法栈)
- 局部变量
4.程序计数器
- 存放地址,描述当前线程接下来要执行的指令在内存的哪个地方
注意:
一个java进程中,可能包含多个线程,多个线程之间,共用同一份堆和方法区,每个线程都有自己的栈和程序计数器。
每个进程有自己的堆,多个进程之间不共享。
Test t = new Test()
t 的引用是在堆上还是在栈上呢?
不确定
决定某个变量在对上还是在栈上,和这个变量是基础类型还是引用类型无关,和这个变量是局部变量还是成员变量还是静态变量有关。
指针就是个变量,里面存的是整数,这个整数表示内存中的地址。引用本质上就是个指针,引用里也是存的整数,含义也是内存中的地址。
以下通过画图的方式来解释基础数据类型和引用数据类型。
a)定义一个变量a:int a = 10,那么基础类型变量中对应的内存空间,直接保存了该值。
b)A a = new A() 引用类型变量中对应的内存空间保存的是另一个内存区域的地址(对象本体的地址),借助地址,可以简介的找到对象本体。
引用存放的是地址,对象是本体,还是以实例化A为例子。
a)局部变量在栈上
b)成员变量在堆上
c)静态变量在方法区上
- 普通方法中有this关键字,和实例相关,普通方法也叫实例方法。
- static方法中没有this,和类线管,和实例无关,静态方法也叫类方法。



