当JAVA虚拟机运行一个程序时,它需要内存来存储已装载的class文件中得到的信息等。Java虚拟机把这些东西都组织到几个“运行时数据区”中,以便于管理。
JVM内存模型结构图:
Java栈:栈由一系列帧组成,帧保存一个方法的局部变量,操作数栈、常量池指针,每次方法调用创建一个帧,并压栈。
java堆:java堆和程序开发密切相关,保存对象,所有线程共享java堆,对分代GC来说,堆也是分代的。分为新生代和老年代。
新生代:存放刚刚创建的对象
老年代:存放幸存区未被回收的对象。
方法区:保存装载的类的信息,类型常量池、字段、方法信息、方法字节码。通常和用就去关联在一起。
PC寄存器:每个线程拥有一个pc寄存器,在线程创建时创建,指向下一条指令的地址,执行本地方法时,pc的值为undefined
栈、堆、方法区交互:
对比:堆上分配和栈上分配
1、小对象,在没有逃逸的情况下可以直接分配在栈上
2、直接分配在栈上,可以自动回收,减轻GC压力,分配在堆上,每次需要清理空间
3、大对象或者逃逸对象无法在栈上分配