Open zgq105 opened 5 years ago
java内存区域是指给java虚拟机在执行java程序所需要分配的各种数据区域。
程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。每个线程有自己单独的程序计数器,互不影响。它是唯一不会OutOfMemoryError的内存区域。它的生命周期和线程保持一致。
Java虚拟机栈(也称java方法栈)也是线程私有的,它的生命周期和线程一致,描述的是 Java方法执行的内存模型。Java虚拟机栈是由一个个栈帧组成,而每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口等信息。 局部变量表存放了基本数据类型变量和对象的引用(指针)。 超过Java虚拟机栈的最大深度限制 -> StackOverFlowError 超过Java虚拟机栈的最大内存限制 -> OutOfMemoryError
本地方法栈和虚拟机栈的机制一样,唯一不同的是本地方法栈是为Native方法服务的。
堆是java虚拟机中最大的一块内存区域,是线程共享的;主要用于存放对象实例,几乎所有new的对象和数组都在堆中分配内存。 超过堆的最大内存限制 -> OutOfMemoryError
方法区是java线程共享的一块内存区域;它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池是方法区的一部分,主要用于存放编译期生成的各种字面量和符号引用。 超过方法区的最大内存限制 -> OutOfMemoryError
分享小知识点: 内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用。(通俗点理解就是占着茅坑不拉屎)
内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况(OOM)。
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)。