JVM,即java virtual machine,以前编程的时候,用的都是封装比较多层的方法了,直到自己看了《深入理解java虚拟机》这本书之后,才发现自己小小的一些操作对于虚拟机而言,都是一个繁琐的运作过程。
JVM内存模型:
1.程序计数器
Program Counter Register,PCB,若线程运行的是java程序,则PCR记录的是正在执行的JVM字节码的地址(行数);若运行的是native方法,则为undefined,这个区域是唯一一个在JVM中没有规定任何内存溢出异常的区域,是线程隔离的
2.java虚拟机栈
JVM stack,生命周期与线程相同,描述的java方法执行的内存模型,每个方法执行的同时创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息,局部变量表存储了各种基本数据类型,对象引用和returnAddress类型,大部分支持动态扩容,允许固定容量,只为执行java字节码,抛出的异常有内存溢出和栈空间溢出
3.本地方法栈
只为了执行native方法服务,不限语言,其余和JVM栈类似
4.java堆
存储对象实例,new出来的对象实例都是在堆里,栈里的是引用,内存空间可物理不连续,但是逻辑上连续,本地内存由GC管理,人称GC堆,没内存可分配,也不能再扩容时,报内存溢出异常(-Xms JVM初始分配的堆内存,-Xmx JVM最大允许分配的堆内存,按需分配)
5.方法区
人称永久区因为基本上进来的都一直都存在,用于存储已被JVM加载的类信息,常量,静态变量,即时编译后的代码等,可报内存溢出的异常
常量池在这里,存放编译期产生的各种字面量和符号引用
图什么的,这么晚就不放了