实例化,掌握栈与堆内存的关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实例化,掌握栈与堆内存的关系相关的知识,希望对你有一定的参考价值。

JAVA中到底有多少内存区域呢?

1)栈内存:可以保存对象的名称(保存,访问的堆内存地址)。

2)堆内存:保存每个对象的全局属性。

3)全局数据区:保存static类型的属性。

4)全局代码区:保存所有方法的定义。

1.声明对象,Person per,栈内存中声明,与数组一样,数组名称保存在栈内存中,只开辟栈内存的对象是无法使用的,必须有其堆内存的引用才能使用。

2,实例化对象,new Person();在堆中开辟内存空间,所有内容都是默认的。

3,String:是一个字符串,首字符是大写的,本身是一个类,就是引用数据类型,默认值是null;

技术分享

1.对象保持在栈内存中,属性保存在堆内存中,在程序中所有的方法是保存在全局代码区中,此区是所有对象共享的。

2.在使用对象的时候,对象必须实例化之后才能使用(实例化对象,并不单单指通过new关键字实现的,只有有堆内存的空间指向,则表示实例化成功)

3,在引用操作的时候,如果一个对象没有堆内存的引用(也就是实例化),而调用属性或方法,就会出现空指向异常。

技术分享

3,对象共用一个堆内存空间:

Person p1=new Person();实例化p1对象

Person p2=p1;把p1的堆内存空间使用权给p2.

此时,设置p2对象的内容,相当于设置p1对象的内容,因为他们是共用一个堆空间。

如,p2.age=30,等价于p1.age=30; 

技术分享

4,垃圾回收机制

Person p1=new Person();

Person p2=new Person();

 

p1.name="小明";

p1.age=30;

 

p2.name="小红";

p2.age=23;

 

p2=p1;此时把p1的堆内存使用权给p2,

因为p2的堆内存指向改变了,这时候p2所指向的内存必须断开,这段内存也就成为了垃圾内存。

技术分享

 

 

以上是关于实例化,掌握栈与堆内存的关系的主要内容,如果未能解决你的问题,请参考以下文章

栈与堆

栈与堆的区别

C 内存的动态分配怎么用?有啥建议吗?内存分配中栈与堆到底有啥不同啊?

栈与堆的区别

数据结构堆、栈与程序内存的堆、栈怎么区别

C#学习笔记----栈与堆的知识