Java中对象的内存分配机制

一、内存划分

Java把内存划分为两种,一种是栈内存,另一种是堆内存。

1、栈内存

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

2、堆内存

堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java中的自动垃圾回收器来管理。

3、栈和堆的之间的关系

在堆中产生一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的值等于数组或对象在堆内存中的首地址,栈中的这个变量就变成了数组或对象的引用变量。引用变量就相当于是为数组或对象定义一个名词,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

说明:引用变量就是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组和对象本身在堆中分配,即使程序运行带使用new产生数组和对象的语句所在的代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它时,如引用变量x=null,才变成垃圾,不能在被使用,但是仍然占着内存,在随后的一个不明确的时间,被垃圾回收器释放掉。这个也是Java占内存较多的主要原因。

二、对象在内存中的分布

在Java语言中,要创建新的对象,需要使用new关键字和对象的类名,如Person p1 = new Person();。等号左边以类名Person作为变量类型,定义了一个变量p1,p1指向等号右边通new关键字所创建一个Person类的实例对象,变量p1就是对象的引用句柄,对象的应用句柄是在栈中分配的一个变量,对象本身是在堆中分配的。

变量在被初始化之前是不能使用的,在一个方法内部的变量必须进行初始化赋值,否则会出现编译无法通过的情况。当一个对象被创建时,会对其中各种类型的成员变量。按照如表所示自动进行初始化赋值。除了基本类型之外的变量类型都是引用类型。如上列的Person及数组。

成员变量类型

初始值(默认值)

byte

0

short

0

int

0

long

0

float

0.0

double

0.0

char

‘\u0000‘

boolean

false

All reference

null

所以,对象内存状态图中的 age 成员变量的初始值为0。
创健新的为最之后,概可以使用“ 对象名.对象成员” 的格式来访间对象的成员(包括属性和方法),Porson类对象的产生和使用方式见示例1.1。

public class TestPerson {
	public static void main(String[] args) {
		Person = p1 = Person();
		Person = p2 = Person();
		p1.age = - 30;
		p1.shout();
		p2.shout();
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_44893902/article/details/105889845