运行时的内存
-
程序计数器
为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立 的程序计数器。即线程之间的计数器之间素影响,计数器放在线程私有的内存中。
-
java虚拟机栈
线程私有。
方法调用会创建栈帧用来存放局部变量、操作栈、动态链接、方法出口等信息。
虚拟机规范中对线程栈深有定义,超过会oom
-
本地方法栈
与虚拟机栈作用相同,不同在于存放Native方法
-
java堆
所有对象实例都在这里分配内存(JIT技术弥补),是GC的主要工作区。
-
方法区
存放虚拟机的类信息、常量、静态变量、即时编译器编译后的代码等数据。因此是各个线程共享内存区域。
-
运行时常量池
方法区的一部分
存放:字面量、符号引用、
-
直接内存
对象访问
Object obj = new Object()
new Object()
在java堆中开辟内存存放所有Object类的实例数据值。
开辟的内存长度不是固定的。且java堆中还要保存访问对象类型的、父类、实现接口、方法等信息的地址。
Object obj
就是一个对象类型引用。那么如何通过引用来定位java堆中位置呢?一般有两种方式 。
- 句柄访问方式。
- 直接指针访问方式 。
句柄的好处:对象被移动,不需要修改reference
直接指针好外:速度快,节省一次指针定位的时间开销。
但是使用第二种方式 。