内存模型
一、数据存储 |
存储位置 控制存储 存储形式 生命周期 寄存器 CPU CPU 静态存储 固态存储 常量池 RAM JVM 栈Stack RAM JVM 静态存储 生命周期确定 堆Head RAM JVM 动态存储 生命周期不定 常量池 final变量 栈 基本类型变量\对象引用 [1] 局部变量 方法停止使用后清空 [2] 全局变量 对象停止使用后清空 堆 包装类型内容\对象内容 对象引用 栈 局部变量\全局变量 对象内容 堆 GC回收 |
二、内存分析 |
[一] 基本类型与包装类 [二] String类 String 对象引用 = "对象内容" 对象引用: 栈 对象内容: [1] 常量池查找 存在直接指向常量池 [2] 堆对象创建 不存在则创建堆对象 String 对象引用 = new String ("对象内容"); |
三、线程 |
独享:Ⅰ 程序计数器:PC Register 控制执行 Ⅱ 本地方法栈:Native Method Stack Ⅲ 栈 :JVM Stack [1] Local Variable Array 本地变量数组 [2] Operand Stack 操作栈 [3] Reference to Constant Pool 引用常量池 共享:Ⅰ 堆 : Heap 创建object、Array ==> GC区域 Ⅱ 方法区: Method Area [1] 运行时常量池 Runtime Constant Pool [Ⅰ] class文件中constant_pool表的Class\Interface 运行时表示 [Ⅱ] 编译时已知的数值、布尔值、字符 [Ⅲ] 运行时解析的Field、Method的引用 [2] 字段方法构造器 Field、Method、Constructor |
四、内存分析 |
使用: 引用: 不使用对象: = 不使用:代码中不使用此对象 无引用对象: = 无引用: 堆中对象,不在被其他变量引用。 可达区域: = 可达到: Gc可到达无引用对象的区域,进行Gc回收。 释放区域: = 可释放: Gc可释放无引用对象的区域,进行Gc回收。 内存溢出: 存储区域的空间不足,[栈-递归调用方法,堆-循环创建对象=填充数据] 内存泄露: 堆区-对象的引用,只被本方变量释放,未被静态他方变量释放。 #原因: 对象不使用,但有引用 <====>区域可达,但不释放。 |