自学内容网 自学内容网

Java 内存区域和内存溢出

Java 内存区域和内存溢出

在这里插入图片描述

本文主要介绍Java 虚拟机内存的各个区域。

围绕两方面内容展开:

  1. 运行时数据区域有哪几块 分别有什么作用?
  2. 如何创建对象,使用对象,对象是什么?

1.运行时数据区域

Java运行时的数据区域包括方法区、虚拟机栈、本地方法栈、堆、程序计数器。

  • 方法区:线程共享的,存放类信息、常量、静态变量等。
  • 虚拟机栈:线程私有的,存储 局部变量,描述的是java方法执行的线程内存模型,从入栈到出栈的过程。
  • 本地方法栈:与虚拟机栈的区别就是执行方法的区别,本地方法栈存放native方法的信息。
  • 堆:线程共享的,对象存储地。GC管理的就是这块。参数-Xmx -Xms调的也是这块
  • 程序计数器:当前线程所执行的字节码的行号指示器。多线程之间相互独立。

2.虚拟机对象

2.1 对象的创建过程

在这里插入图片描述

2.2 对象的内存布局

对象主要由对象头、实例数据、对齐填充三个部分组成

  • 对象头:一部分包含存储对象自身的运行数据(HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等),另外一部分是类型指针:对象指向他的类型元数据的指针。如果是JAVA数组,还有一块记录数组长度的数据
  • 实例数据:在代码中定义的各种类型的字段内容
  • 对齐填充:为了满足对象的长度是8字节的倍数

2.3 如何访问对象

通过栈上的reference来操作堆上的具体对象,reference是对象的一个引用,那么这个引用是如何定位到对象的呢?

  • 通过句柄

    从堆中划分出句柄池,句柄包含了对象实例数据和各类型数据各自具体的地址信息。好处是对象被移动的时候只需要改变句柄中的指针地址就好了。
    在这里插入图片描述

  • 直接指针

    reference存储的就是对象地址。好处是块,减少了中间成本。

链图片转存中…(img-lCprCGz5-1721553343002)]

  • 直接指针

    reference存储的就是对象地址。好处是块,减少了中间成本。

    在这里插入图片描述

参考文献:

  1. 《深入理解Java虚拟机 --周志明》

原文地址:https://blog.csdn.net/weixin_47467016/article/details/140590707

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!