以前的面试中偶尔会被问起这个,当时回答的也是支支吾吾。有点惭愧,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。
网友评论