zgq105 / blog

2 stars 0 forks source link

Java内存区域划分总结 #33

Open zgq105 opened 5 years ago

zgq105 commented 5 years ago

image

1. 什么是java内存区域

java内存区域是指给java虚拟机在执行java程序所需要分配的各种数据区域。

2. 内存分类

2.1 程序计数器(线程私有)

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。每个线程有自己单独的程序计数器,互不影响。它是唯一不会OutOfMemoryError的内存区域。它的生命周期和线程保持一致。

2.2 java虚拟机栈(线程私有)

Java虚拟机栈(也称java方法栈)也是线程私有的,它的生命周期和线程一致,描述的是 Java方法执行的内存模型。Java虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口等信息。 局部变量表存放了基本数据类型变量和对象的引用(指针)。 超过Java虚拟机栈的最大深度限制 -> StackOverFlowError 超过Java虚拟机栈的最大内存限制 -> OutOfMemoryError

2.3 本地方法栈(线程私有)

本地方法栈和虚拟机栈的机制一样,唯一不同的是本地方法栈是为Native方法服务的。

2.4 堆(线程共享)

堆是java虚拟机中最大的一块内存区域,是线程共享的;主要用于存放对象实例,几乎所有new的对象和数组都在堆中分配内存。 超过堆的最大内存限制 -> OutOfMemoryError

2.5 方法区(线程共享)

方法区是java线程共享的一块内存区域;它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池是方法区的一部分,主要用于存放编译期生成的各种字面量和符号引用。 超过方法区的最大内存限制 -> OutOfMemoryError

分享小知识点: 内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用。(通俗点理解就是占着茅坑不拉屎)

内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况(OOM)。