一、内存概念
内存主要分为栈、堆、方法区三部分。三者相互配合完成程序的执行和内存管理。
二、栈(Stack)
栈通常用于存储方法调用的信息,包括局部变量、方法参数、返回地址等。每当一个方法被调用时,系统都会为该方法分配一个栈帧(Stack Frame)的内存区域,用于存储方法执行过程中的相关信息。当方法执行结束后,
栈的特点和功能:
1、先进后出:最后放入栈中的元素首先被移除。
2、限制大小:栈的大小通常是固定的,当栈空间不足时可能会发现栈溢出的错误。栈的大小 通常由虚拟机在启动时确定。
3、自动管理:栈的分配和释放是自动管理的。
4、栈中的数据只在方法调用时有效。
三、堆(Heap)
堆用于存储对象实例和数组等动态分配的内存。对重存储的对象实例和数组是通通过引用访问的,对象本身的引用存储在栈中。栈中的引用指向对堆中的对象,通过引用可以访问对象的属性和方法。
堆的特点:
1、动态分配:通过new关键字创建的对象都会被分配在堆上。
2、大小可变:堆的大小通常是可变的。
3、自动垃圾回收:由虚拟机根据需要进行动态分配和回收。
4、生命周期:对象在堆上分配后,可以被多个方法使用,直到没有引用指向它时,才会被垃 圾回收。
四、方法区(Method Area)
方法区用于存储类的结构信息、静态变量等,在java虚拟机启动时被创建。
方法区的特点:
1、存储类的数据:方法区存储每个类的结构信息,包括类的方法、父类、接口等。
2、存储静态变量:方法区存储类的静态变量(使用static关键字声明的变量),这些变量在类 加载时被分配内存。
3、存储常量:方法区存储了字符串、符号引用和一些特定常量(如final变量)。常量在编译期间生成。
五、三者示意图