Java中的内存管理机制 ╰+哭是因爲堅強的太久メ 2022-05-22 04:18 197阅读 0赞 # Java中的内存管理机制 # ### Java内存的划分 ### 1. java把内存分为两种 * 栈内存 * 堆内存 2. 栈内存 * 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码中定义一个变量时,java就会在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存,该内存空间可以立即另作他用 3. 堆内存 * 堆内存用于存放由new创建的对象和数组,在堆中分配内存,由GC来自动回收内存。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或对象的引用变量,以后可以在程序中使用栈内存的引用变量来访问堆中的数组或对象,引用变量相当于为数组或对象起的一个名字,或者代号 4. 释放时机 * 引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放 * 数组或对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码之外,数组和对象本身占用的堆内存也不会释放,数组和对象在没有引用变量指向它的时候,才能变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉--这也是java比较占内存的主要原因 5. java中的“指针” * 首先明确:java不谈指针 * 栈中的变量指向堆内存的变量--这就是java中的指针 ### 内存分配策略 ### 1. 静态存储分配 * 是指在编译时期就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间 * 静态分配策略要求程序代码中不许有可变数据结构的存在,也不允许有嵌套或者递归的结构出现(因为会导致编译程序无法计算准确的存储空间) 2. 栈式存储分配 * 也称动态存储分配,是由一个类似于堆栈的运行栈来实现的,和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存。 3. 堆式存储分配 * 专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配 * 比如可变长字符串和对象实例 * 堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放 ### 通俗易懂的解释 ### <table style="margin-top:15px;margin-right:0px;margin-bottom:15px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;"> <thead style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;"> <tr style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;border-top-width:1px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:solid;border-top-color:rgb(204,204,204);background-color:rgb(255,255,255);"> <th style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;font-weight:bold;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">术语</th> <th style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;font-weight:bold;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">解释</th> <th style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;font-weight:bold;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">特点</th> <th style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;font-weight:bold;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">优点</th> <th style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;font-weight:bold;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">缺点</th> </tr> </thead> <tbody style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;border-top-width:0px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;"> <tr style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;border-top-width:1px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:solid;border-top-color:rgb(204,204,204);background-color:rgb(255,255,255);"> <td style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">堆</td> <td style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">存放对象</td> <td style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">应用程序在运行的时候请求操作系统分配给自己内存,由于操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低,但是灵活</td> <td style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">大小可以不固定</td> <td style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">速度慢</td> </tr> <tr style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;border-top-width:1px;border-right-width:0px;border-bottom-width:0px;border-left-width:0px;border-top-style:solid;border-top-color:rgb(204,204,204);background-color:rgb(248,248,248);"> <td style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">栈</td> <td style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">执行程序</td> <td style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">运行函数的时候,局部变量、形式参数,都是从栈中分配内存空间的,退出函数的时候,修改栈指针就可以把栈中的内容销毁,因此速度非常的快,但是分配的大小是确定的,不变的</td> <td style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">存取速度快,仅次于寄存器</td> <td style="margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:6px;padding-right:13px;padding-bottom:6px;padding-left:13px;border-top-width:1px;border-right-width:1px;border-bottom-width:1px;border-left-width:1px;border-top-style:solid;border-right-style:solid;border-bottom-style:solid;border-left-style:solid;border-top-color:rgb(204,204,204);border-right-color:rgb(204,204,204);border-bottom-color:rgb(204,204,204);border-left-color:rgb(204,204,204);">大小固定</td> </tr> </tbody> </table> ### 记住以下箴言 ### * java程序的运行就是通过堆栈的操作来完成的; * 堆栈以帧为单位保存线程的状态; * JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作 * 当前方法使用的帧称为当前帧 * java自动管理堆和栈,程序猿不能直接的设置栈或堆
相关 Java中的自动内存管理机制详解 Java的自动内存管理主要通过垃圾回收(Garbage Collection,GC)机制来实现。下面详细解析: 1. **对象分配**:当创建一个新的对象时,Java虚拟机会 分手后的思念是犯贱/ 2024年09月19日 01:00/ 0 赞/ 6 阅读
相关 深入浅出Java中的内存管理机制及其问题 Java的内存管理主要包括栈内存、堆内存、方法区和本地线程缓存(TLAB)等几个部分。 1. 栈内存:每个线程都有一个独立的栈,用于存储局部变量、方法参数和返回地址。栈的空间 向右看齐/ 2024年09月13日 13:45/ 0 赞/ 18 阅读
相关 JVM内存管理机制:Java中的垃圾回收示例 Java中的内存管理主要依赖于Java虚拟机( JVM )的垃圾回收机制。以下是垃圾回收的基本概念和一个简单的示例: 1. 垃圾: 在Java中,不再使用的对象被称为垃 雨点打透心脏的1/2处/ 2024年09月10日 04:54/ 0 赞/ 19 阅读
相关 C++ 中自动化内存管理的机制 1. 对象生命周期管理:在 C++ 中,对象的生命周期由它的作用域和生存期管理。当对象超出其作用域时,C++ 编译器会自动调用对象的析构函数来释放其资源。这意味着当对象不再需 亦凉/ 2024年03月23日 23:52/ 0 赞/ 7 阅读
相关 Java内存管理机制 一、Java内存分配 Java将一整块Java内存划分为几个部分: 方法区 存储的是Java的类信息和常量,静态变量等,比如public final static Love The Way You Lie/ 2024年03月17日 22:15/ 0 赞/ 40 阅读
相关 [C++] C++中的内存管理机制 目录 1. C/C++的内存分布 2. C语言与C++内存管理方式 2.1 C语言管理方式 2.2 C++内存管理方式 3 使 淡淡的烟草味﹌/ 2022年10月07日 00:58/ 0 赞/ 128 阅读
相关 swoole_server中内存管理机制 swoole\_server启动后内存管理的底层原理与普通php-cli程序一致。具体请参考Zend VM内存管理方面的文章。 局部变量 在事件回调函数返回后,所有局部 £神魔★判官ぃ/ 2022年09月27日 06:43/ 0 赞/ 83 阅读
相关 Java中的内存管理机制 Java中的内存管理机制 Java内存的划分 1. java把内存分为两种 栈内存 堆内存 2. 栈内存 ╰+哭是因爲堅強的太久メ/ 2022年05月22日 04:18/ 0 赞/ 198 阅读
相关 Java内存管理机制 public class Test1 { public static void main(String[] args) { Test1 柔情只为你懂/ 2022年05月15日 02:51/ 0 赞/ 197 阅读
还没有评论,来说两句吧...