java虚拟机 第二章Java内存区域与内存溢出异常

Posted karryzhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java虚拟机 第二章Java内存区域与内存溢出异常相关的知识,希望对你有一定的参考价值。

1、运行时数据区域

  1.1、程序计数器

      线程私有,当前线程所执行的字节码行号指示器,

      Java虚拟机的多线程是通过线程轮流切换处理器执行时间的方式来分配

  1.2、Java虚拟机栈

      线程私有,,虚拟机的局部变量表每个方法在执行的时候都会创建栈帧用于存储局部变量,操作数栈,动态链接方法出口等信息,每个方法从开始到结束

    对应着一个栈帧从入栈到出栈的过程,

  1.3、本地方法栈

      线程私有,本地方法栈是为虚拟机执行native方法服务,有的虚拟机奖本地方法栈与虚拟机栈合二为一。

  1.4、Java堆

      GC堆,垃圾收集器管理的主要区域,用于存放对象实例,几乎所有的Java对象实例都在这里分配空间,

  1.5、方法区

      用于存放虚拟机加载的类信息,常量,静态变量,方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量

  1.6、运行时常量池

       JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。

      而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。

      在解析阶段,会把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是我们上面所说的StringTable,

      以保证运行时常量池所引用的字符串与字符串常量池中是一致的。

  1.7、直接内存

      Java使用naive函数库直接分配堆外内存,避免了在java堆和native堆中来回复制数据

2、hotspot虚拟机

  2.1、对象的创建

      如果java虚拟机的空闲内存是连续的,直接向后挪出一段与对象大小相等的距离,称为 指针碰撞

      如果不连续,则从剩余内存中寻找出足够大小的内存存放,称 为 空闲列表方式

        如何避免线程安全

            为每个线程分配空间

            cas配上失败重试

  2.2对象的内存布局

      对象头:运行时的自身数据(哈希码,gc分代年龄,锁状态)、类型指针

      实例数据:对象真正存储的数据

      对齐填充:每个对象的起始地址必须为8字节的整数倍

  2.3 对象的访问定位

      句柄访问:reference指向句柄池接着再指向具体对象,避免了对象的修改而需要修改reference的修改,增加了一次寻址

      直接指针定位:直接指向具体对象,

以上是关于java虚拟机 第二章Java内存区域与内存溢出异常的主要内容,如果未能解决你的问题,请参考以下文章

2.1 自动内存管理机制--Java内存区域与内存溢出异常

JVM-Java内存区域与内存溢出异常

JVM-Java内存区域与内存溢出异常

深入理解java虚拟机学习 笔记 第二章 java 内存区域和内存溢出异常

Java自动内存管理机制学习:Java内存区域与内存溢出异常

深入Java虚拟机之一:Java内存区域与内存溢出