java 堆,栈 存储分享
1.寄存器 最快的存储区,有编译器根据需求进行分配,程序无法控制。
2.栈,存放基本类型的变量数据和对象的引用地址,对象本身不存放在栈中,而是存放在堆 或者 常量池中(字符串常量)
3.堆,存放所有new出来的对象。
4.静态域,存放静态成员。
5.常量池,存放字符串常量和基本类型常量(public static final)
6.栈和常量池中的对象可以共享,堆中的对象可以不共享。
栈中的数据大小,生命周期可以确定的,当没有引用指向数据时,这个数据就会消失。
堆中的对象由gc负责回收,大小和生命周期不需要确定,具有灵活性。
7.对于字符串,其对象的引用都是存放在栈中,如果编译期已经创建好,就存放在常量池中,如果new 菜存放在堆中,
两个字符串常量相加 等于存放在常量池中,如何两个变量相加相当于new 存放在堆中。
常量池 是在堆中开辟一个很小的内存。
Java把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
1.寄存器 最快的存储区,有编译器根据需求进行分配,程序无法控制。
2.栈,存放基本类型的变量数据和对象的引用地址,对象本身不存放在栈中,而是存放在堆 或者 常量池中(字符串常量)
3.堆,存放所有new出来的对象。
4.静态域,存放静态成员。
5.常量池,存放字符串常量和基本类型常量(public static final)
6.栈和常量池中的对象可以共享,堆中的对象可以不共享。
栈中的数据大小,生命周期可以确定的,当没有引用指向数据时,这个数据就会消失。
堆中的对象由gc负责回收,大小和生命周期不需要确定,具有灵活性。
7.对于字符串,其对象的引用都是存放在栈中,如果编译期已经创建好,就存放在常量池中,如果new 菜存放在堆中,
两个字符串常量相加 等于存放在常量池中,如何两个变量相加相当于new 存放在堆中。
常量池 是在堆中开辟一个很小的内存。
Java把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。
堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
本文详细介绍了Java中的内存划分,包括寄存器、栈、堆、静态域和常量池等不同区域的特点及用途。解释了栈内存用于存放局部变量和对象引用,而堆内存则用于存放通过new操作符创建的对象。
7919

被折叠的 条评论
为什么被折叠?



