内存理解--coreJava

内存分配:

寄存器:是CPU内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。

栈       :存放基本数据类型和对象的引用,而对象本身却是存放在堆中的。

堆       :存放new出来的数据。

常量池:存放常量。

非RAM存储:硬盘等永久性存储空间。

栈:在函数中定义的一些基本类型的变量数据和对象的引用变量都在函数的栈内存中分配。
当在一段代码块定义一个变量时,Java就在栈中 为这个变量分配内存空间,当该变量退出该作用域
后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

堆:堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管
理。
在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是 为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序 运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java 比较占内存的原因

扫描二维码关注公众号,回复: 236185 查看本文章

常量池:指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。

              在程序执行的时候,常量池是存储在方法区中,而不是堆中。

区别:

堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存 大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态 分配内存,存取速度较慢。

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是 确定的,缺乏灵活性。栈中的基本数据可以共享,而和两个对象的指向同一个引用不同,因为基本类型是编译完成的。

 概括:

栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String,数组.对象等等)但不存放对象内容
堆中存放使用new关键字创建的对象.
字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定(常量池和堆).有的是编译期就已经创建好,存放在字符串常 量池中,而有的是运行时才被创建.使用new关键字,存放在堆中。

猜你喜欢

转载自jackpot1234.iteye.com/blog/2361334
今日推荐