java的内存区域有哪些
- 程序计数器Program Counter Register:记录要执行的下一条字节码指令,每条线程有自己的程序计数器,线程私有
-
虚拟机栈 VM Stack:也是线程私有的,每个java方法都会创建一个栈帧,存放局部变量表、操作数栈、动态链接、方法出口等信息
局部变量表是我们比较关心的,里面存放了各种基本数据类型,还有各种对象的引用(只是引用,而不是对象本身) - 本地方法栈Native Method Stack:为Native方法服务,线程私有。
- Java堆 Heap:唯一的目的就是存放java对象实例,几乎所有的对象都在这里分配内存。java堆也是垃圾收集器管理的主要区域。该区域内存是各个线程共享的。
- 方法区 Method Area:存放被加载的类信息、常量、静态变量、即时编译器编译后的代码等。线程共享
- 运行时常量池 Runtime Constant Pool:方法区的一部分,存放字面量和符号引用。
- 直接内存 Direct Memory:用于Java的NIO的直接内存方法。
|| 作用 | 线程 |
|----|:-----:|:----:| :----:|
|程序计数器|记录要执行的下一条字节码指令 | 私有 |
|虚拟机栈| 存放局部变量表、操作数栈、动态链接、方法出口等信息 | 私有 |
|本地方法栈| 为Native方法服务 | 私有 |
|Java堆| 唯一的目的就是存放java对象实例| 共享 |
|方法区| 存放被加载的类信息、常量、静态变量、即时编译器编译后的代码等 | 共享 |
| 运行时常量池| 方法区的一部分,存放字面量和符号引用 | 共享 |
|直接内存| 用于Java的NIO的直接内存方法 | 共享 |
java对象的创建过程
java对象的创建从语言层面来看,只要通过new即可创建一个对象。而虚拟机做的工作是:先从常量池中找到类的符号引用,再去方法区寻找类的信息。如果类还没有被加载过,则先加载类的信息。再从java推中分配内存创建对象。分配内存的策略一般有两种,一种是指针碰撞;一种是空闲列表。两种的使用取决于java堆内存是否规整,是否规整取决于垃圾收集器是否有压缩整理java堆的功能。