J2SE:小议堆(heap)和栈(stack)

以前的面试中偶尔会被问起这个,当时回答的也是支支吾吾。有点惭愧,so,今天来认真学习一番。

栈:(运行时单位)

一些基本类型的变量对象的引用都是保存在栈中,当变量或者对象的引用出了作用域就会自动释放。

{                           
     int a = 99;            
}                           

以上代码中,定义了一个int型变量a并给它赋初值,大括号范围内为a的作用域,当代码运行完该段作用域后,会自动释放掉为a分配的内存空间。

堆:(存储时单位)

通过new XXX()方式创建的对象保存在堆中(字符串常量、基本数据类型常量保存在常量池中

{                           
     Music myMusic = new Music();            
}                           

以上代码会同时分配两块内存,对象引用myMusic保存在栈中,对象Music保存在堆中。

当程序运行完new Music()的代码后,该段代码的作用域就已经结束了,但是该对象仍然占据着内存,在随后的一个不确定的时候被垃圾回收器回收掉。

补充

如果栈内存不够,JVM会抛出java.lang.StackOverFlowError。
而如果是堆内存不够,JVM会抛出java.lang.OutOfMemoryError。

你可能感兴趣的:(J2SE:小议堆(heap)和栈(stack))