java内存机制中的堆栈常量池简介

来源:互联网 发布:80端口入侵教程 编辑:程序博客网 时间:2024/06/05 02:21

java内存分配只要包括以下几个区域:
1,堆:存放用new出来的对象。
2,栈:存放基本数据类型和对象的“引用”,但对象本身不再栈中而是存放在栈中
3,常量池:存放常量
4,寄存器:我们在程序中无法控制
5,静态域:存放在对象中使用static定义的静态成员
6,非RAM存储:磁盘等永久存储空间


java内存中分配的栈
为函数中定义的一些基本类型的数据和”对象引用变量”等都在函数的栈内存中分配,当一段代码
块定义一个变量的时候。java就在栈中为这个变量分配内存空间,当该变量退出作用域后,java会自动释放掉
为该变量分配的内存空间。

java内存中分配的堆
堆内存中用来存放new出来的对象数组,堆中的内存分配是由java虚拟机的垃圾自动回收来进行管理。
在堆中产生了一个数组或者对象后,引用变量就相当于是为这个数组或者对象取的名字,以后就可以在程序中
使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是数组或者对象的一个名称
引用变量是普通的变量,定义在栈内存中,引用变量在程序运行到作用于之外后被释放,堆数组和对
象本身在堆中分配,即使程序运行到使用new产生数组对象的语句所在代码块之外,对象的数组占用的内存也
不会释放,数组和对象在没有引用变量指向的时候,会变为垃圾不能被使用,但是仍然占着内存,随后在一个
不确定的时间被GC收走。

常量池
存放字符串常量和基本类型常量


例子
String s1 = “China”;
String s2 = “China”;
String s3 = “China”;

String ss1 = new String(“China”);
String ss2 = new String(“China”);
String ss3 = new String(“China”);

其中s1,s2,s3,ss1,ss2,ss3都是引用变量(String不是基本类型,而是引用类型),所以存放在栈中,
China 是字符串常量,存放在常量池中, new String(”China”)是new出来的字符串,存放在堆中。

参考文章:http://www.cnblogs.com/SaraMoring/p/5687466.html

原创粉丝点击