(深入理解JVM)Java内存区域与内存溢出的异常

Java内存的区域

程序计数器(线程私有)

程序计数器是一块很小的内存空间,可以被视作为当前线程所执行的字节码的行号指示器。如果线程执行的是java的 方法,这个计数器记录的虚拟机执行指令码的行数。如果执行的是Native的方法则计数器为空。不会出现OutOfMemoryError的错误。

java虚拟机栈(线程私有)

在每个方法执行的时候会创建一个栈帧,栈帧是用来存储方法中的局部变量表,操作数栈,动态链接,方法入口的等的信息,每个方法的调用到执行结束队形的就是在虚拟机栈中的入栈和出栈。

这里值得注意的是栈和堆的区别:

 1. 首先是被线程拥有的方式:栈内存是被线程私有的,而堆内存是被线程所共享的。
 2. 效果是不同的:栈内存用来存储的是每个方法当中的一些相关的内容比如(局部变量表,操作数栈,动态链接,方法入口等等),而堆中存储的是对象的实例。

抛出的异常为Stack OverflowError
或者是OutOfMemoryError

本地方法栈

这是在Java中调用本地方法时候会使用的内存空间,这个栈也会抛出OutOfMemoryError

java堆(线程共有)

Java堆(Java Heap)是虚拟机所管理内存的最大的一块的空间,其中垃圾回收主要回收的堆中的内存。
其中主要存储的是对象的实例几乎所有的实例都存在于堆中。
Java堆是垃圾回收的主要的区域因此被称为"Gc堆"(Garbage Collected Heap),从内存回收的角度可以分为:新生代和老年代,更细一点的划分为:Eden空间,From Survivor ToSurvivor空间

抛出的异常为 OutOfMemoryError

方法区(线程共有)

方法区用于存储:虚拟机加载的类的信息,常量,静态变量,即使编译器编译后的代码的数据。
我对方法区的理解为:方法区是用来存储Class文件的内容,当我们执行一个JAVAC命令的时候,我们便已经把这个类加载到了我们的java虚拟机当中。

抛出的异常为 OutOfMemoryError

运行时常量池(线程共有并且是方法区的一部分)

Class文件中包含类的版本(即魔数),字段,方法,接口等描述信息以外还包含一项信息为常量池(编译时期生成的各种字面变量和符号引用)。
运行时常量池可以动态的向里面添加内容,运行期间可能将新的常量放入池当中去。

抛出的异常为 OutOfMemoryError

直接内存

这块内存并不是java运行时数据区,但是由于引入的NIO的原因这个部分内容与NIO的内容相关。
NIO(New Input/Output)是基于通道和缓冲区的一种IO类。它可以使用Native函数来直接分配堆外内存,然后通过分配在Java堆中的DirectByteBuffer来作为这块对象的引用来对这块内存进行管理,这样的优点在于避免了数据复制到堆当中然后进行操作的时间,提高了性能。

扫描二维码关注公众号,回复: 5289089 查看本文章

这块内存受限于本机内存,也会抛出OutOfMemoryError异常。

对象的创建过程

1 类加载过程

2 创建对象的方式

如果类已经加载完全了,那么便可以去创建这类的对象的实例。
创建对象的实例可以有两种方式:
1 指针碰撞的方式:这样的方式是把堆内存分为两部分:使用了的和未使用的内存。这两个内存之间存在一个指针,这个指针用来记录两个部分。
2 空闲列表方式:这个方式是用一个列表来保存堆内存中没有被使用的内存部分,然后创建对象的时候把实例放在空闲的内处。
上面分配存在一点点缺点在于:没有处理好好并发情况下的问题。并发的问题解决的方法也有两种方式:
1 乐观的方式即采用CAS规则来判断,符合规则的时候再去分配内容。
2 创建了了一个TLAB(ThreadLocalAllocationTable)线程相关的分配列表,这个列表的作用在每一个线程里面创建一个空间来用来存储空表的内容

值得注意的是:当内存分配好了以后,会对实例中的内容进行内容初始化零值。

3 虚拟机对对象进行必要的设置

比如 是哪个类的实例,如何找到类的元数据信息,对象的哈希码,对象的GC年龄分代的信息。

4 最后执行的方法

对实例对象进行赋值。

对象的内存的布局

1对象头

对象头包含两部分信息:
1 存储对象自身运行时候的数据
2 类型指针:即对象指向它的类元数据的指针目的是为了让虚拟机知道这个对象是哪个类的实例。

2 实例数据

实例真正存储的数据。

3 对齐填充

对象访问的定位

在一个栈中如果想要访问一个对象,需要找到对象的位置,有两种寻找对象的方法。
1 句柄访问 指向实例在堆中的地址,也指向对象类型数据的指针
2 直接指针访问直接指向在堆中的地址,并且含有一个指向类型数据的指针。

猜你喜欢

转载自blog.csdn.net/weixin_43872339/article/details/87441285