Optimization:Memory

内存模型

一、数据存储

                存储位置  控制存储      存储形式   生命周期

寄存器     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回收。

内存溢出: 存储区域的空间不足,[栈-递归调用方法,堆-循环创建对象=填充数据]

内存泄露: 堆区-对象的引用,只被本方变量释放,未被静态他方变量释放。

   #原因:  对象不使用,但有引用 <====>区域可达,但不释放。

猜你喜欢

转载自blog.csdn.net/ddhmbbklyk2018/article/details/82769151