java的内存区域

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堆的功能。

推荐阅读更多精彩内容