美文网首页
深入理解JAVA笔记-JAVA内存区域

深入理解JAVA笔记-JAVA内存区域

作者: 天外星雨 | 来源:发表于2016-07-25 20:44 被阅读0次

    1 运行时内存区域

    JAVA虚拟机在执行java程序的过程中会把它管理的内存划分成若干个不同的数据区。

    1.1 程序计数器

    相当于PC指针,每个线程都有独立的程序计数器,线程私有,如果线程执行的是native方法,这个计数器的值为空。

    1.2 JAVA虚拟机栈

    这个区域也是线程私有的,生命周期和线程相同,每个方法执行的时候都会创建一个栈帧,和C语言里面的栈类似,但是不同的是,这个栈帧里面包含了局部变量表操作数栈动态链接方法出口等信息。

    1.3 本地方法栈

    执行本地方法的栈。

    1.4 JAVA堆

    JAVA堆是JAVA虚拟机所管理的内存中最大的一块,类似于C程序中的堆得概念,垃圾回收主要就发生在这里,这块区域各个线程共享。

    1.5 方法区

    线程共享,用于存储已经被虚拟机加载的类信息,常量,静态变量、即使编译器编译后的代码等数据,别名Non-heap。

    1.6 运行时常量池

    方法区的一部分,相比于class文件中的常量池,这里的常量池具有一定的动态性。

    1.7 直接内存

    直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是JAVA虚拟机规范中定义的一部分,java nio,避免了在java堆和native堆之间来回复制数据。

    2 对象的内存布局

    对象在内存中的布局可以被分为3块区域:对象头(header),实例数据(Instance)和对齐填充(Padding)。

    • 对象头,包含两部分的信息
      • 第一部分存储对象自身的运行时数据,如哈希值、GC分代年龄、锁状态标识、线程持有的锁等。
      • 第二部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
    • 实例数据

    是对象真正存储的有效信息,也是程序代码中所定义的各种类型的字段内容,无论是父类中继承的,还是子类中的,这些字段按顺序存储。

    • 对齐数据
      HotSpot VM规定对象大小必须是8字节的整数倍。对象实例数据没有对齐时,需要通过对齐填充来补全。

    相关文章

      网友评论

          本文标题:深入理解JAVA笔记-JAVA内存区域

          本文链接:https://www.haomeiwen.com/subject/uwxnjttx.html