原标题:Java面试最常见的问题:JVM的内存机制是什么?
JVM中的内存分为五个部分:
(1)方法区:存储加载的class字节码,通过该区域我们能寻址到类中的方法的入口。除此之外,方法区还包括运行时常量区和静态常量区。这个区域是所有线程共享的。
(2)堆:存储new出来的对象,垃圾回收器主要监控和回收的就是这块区域。在堆里面不断创建对象但是垃圾回收器不回收,就有可能造成OutOfMemoryError错误。这个区域也是线程共享的。
(3)虚拟机栈:存储所有被调用的java方法的上下文。在main方法里面调用test方法,则在虚拟机栈里面push进test方法上下文,调用完毕,则pop出test方法的上下文。倘若在main方法里面递归调用main方法,则虚拟机栈则会被消耗光资源,造成StackOverflowError错误。这个区域是线程隔离的,也就是说每个线程都有一个虚拟机栈。
(4)本地方法栈:本地方法栈与虚拟机栈类似,只不过本地方法栈中存储所有被调用的本地native方法的上下文。这个区域也是线程隔离的。
(5)程序计数器:存储着CPU下一条指令的地址,也就是说记录着现在程序执行到了哪里,执行到了那条语句,哪个指令。这个区域也是线程隔离的。
接下来,我们将分析一下下面的代码执行过程中JVM的内存变化。
public class Test
{
public static void main(String args[])
{
User user = new User();
user.id = 123;
String name="ali";
user.setName(name);
User user1 = new User();
user1.setName("zhangli");
}
}
class User{
private int id;
private String name;
public User(int id,String name)
{
this.id = id;
this.name = name;
}
public User(){}
public void setId(int id)
{
this.id = id;
}
public int getId()
{
return this.id;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return this.name;
}
责任编辑: