Java中堆内存和栈内存详解文档格式.doc
- 文档编号:13161347
- 上传时间:2022-10-07
- 格式:DOC
- 页数:5
- 大小:43.50KB
Java中堆内存和栈内存详解文档格式.doc
《Java中堆内存和栈内存详解文档格式.doc》由会员分享,可在线阅读,更多相关《Java中堆内存和栈内存详解文档格式.doc(5页珍藏版)》请在冰豆网上搜索。
通过new产生的数组和对象分配在堆内存中。
堆内存中分配的内存,由JVM提供的GC(垃圾回收机制)来管理。
在堆内存中产生了一个数组对象后,我们还可以在栈中定义一个变量,这个战中变量的取值等于堆中对象的首地址。
栈内存中的变量就成了堆内存中数组或者对象的引用变量。
我们以后就可以在程序中直接使用栈中的这个变量来访问我们在堆中分配的数组或者对象,引用变量相当于数组或者对象起的一个别名,或者代号。
引用变量是一个普通的变量,定义时在栈中分配;
引用变量在被运行到它的作用域之外时就被释放,而我们的数组和对象本身是在堆中分配的,即使程序运行到使用new产生对象的语句所在的函数或者代码之后,我们刚才被产生的数组和对象也不会被释放。
数组和对象只是在没有引用变量指向它,也就是没有任何引用变量的值等于它的首地址,它才会变成垃圾不会被使用,但是它任然占据着内存空间不放(这也就是我们Java比较吃内存的一个原因),在随后一个不确定的时间被垃圾回收器收走。
实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针!
publicclassArrayTest{
publicstaticvoidmain(String[]args){
intx[]=newint[100];
intsum=0;
for(inti=0;
i<
100;
i++){
sum+=x[i];
}
}
}
我们可以intx[]=newint[100];
分成两部分来写:
intx[];
和x=newint[100];
。
第一部分相当于定义了一个普通的变量,只是这个变量中存放的数据是堆中某个对象的首地址。
接着我们使用,这一句是在堆内存中产生了一个有100个元素整数类型的数组。
当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。
除了基本数据类型之外的变量都是应用类型。
Personp1=newPerson();
执行完后的内存状态
创建新的对象之后,我们就可以使用“对象名.对象成员”的格式,来访问对象的成员(包括属性和方法)。
publicclassPerson{
intage;
voidshout(){
System.out.println(age);
publicstaticvoidmain(String[]args){
Personp1=newPerson();
Personp2=newPerson();
p1.age=30;
p1.shout();
p2.shout();
上面程序运行的内存布局如下图:
Java中内存分配策略及堆和栈的比较
1、内存分配策略
按照编译原理的观点,程序运行时的内存分配有三种原则,分别是静态的,栈式的,和堆式的。
静态存储分配时指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间。
这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为他们都会导致编译程序无法计算准确的存储空间需求。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 内存 详解