java内存区域

运行时的内存

  1. 程序计数器

    为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立 的程序计数器。即线程之间的计数器之间素影响,计数器放在线程私有的内存中。

  2. java虚拟机栈

    线程私有。

    方法调用会创建栈帧用来存放局部变量、操作栈、动态链接、方法出口等信息。

    虚拟机规范中对线程栈深有定义,超过会oom

  3. 本地方法栈

    与虚拟机栈作用相同,不同在于存放Native方法

  4. java堆

    所有对象实例都在这里分配内存(JIT技术弥补),是GC的主要工作区。

  5. 方法区

    存放虚拟机的类信息、常量、静态变量、即时编译器编译后的代码等数据。因此是各个线程共享内存区域。

  6. 运行时常量池

    方法区的一部分

    存放:字面量、符号引用、

  7. 直接内存

对象访问

Object obj = new Object()

new Object()在java堆中开辟内存存放所有Object类的实例数据值。

开辟的内存长度不是固定的。且java堆中还要保存访问对象类型的、父类、实现接口、方法等信息的地址。

Object obj就是一个对象类型引用。那么如何通过引用来定位java堆中位置呢?一般有两种方式 。

  • 句柄访问方式。

  • 直接指针访问方式 。

句柄的好处:对象被移动,不需要修改reference

直接指针好外:速度快,节省一次指针定位的时间开销。

但是使用第二种方式 。

posted @ 2020-11-11 20:20  yvzhu  阅读(79)  评论(0编辑  收藏  举报