最近在学Jvm的知识,把以前学过的东西作一下总结,尽可能本身复现出来数组
画的明明很清晰的,为啥我看着这么糊...markdown
Java虚拟机主要由两大系统和两大组件构成,两大系统分别是类加载子系统和执行引擎,两大组件分别是运行时数据区和本地方法接口,这里主要对运行时数据区作一下总结spa
运行时数据区分为五个内存区域,分别是堆,方法区,虚拟机栈,本地方法栈,程序计数器,类加载子系统将字节码文件的不一样数据加载到不一样的区域,执行引擎在执行命令时与运行时数据区的数据进行动态交互.(大概是这么个意思,可能之后会有新的理解)线程
堆:堆是JVM内存中最大的一块区域,是GC的主要工做区域,能够位于物理上不连续,但逻辑上连续的空间,主要用来存放对象实例和数组,线程共享,当内存中没有足够的空间分配给新的实例,又没法继续扩展时就会出现OutOfMemoryError,堆根据垃圾回收又可再分为新生代和老年代,新生代又可再分为Eden空间,from survivor空间,to survivor空间code
方法区:线程共享,主要存储类信息,静态变量,常量以及编译后的方法对应的二进制指令集等数据,同时方法区内部还包含运行时常量池,主要用来存储编译器生成的字面量和符号引用,内存有限在内存不足又没法继续申请时出现OutOfMemoryError,能够申请不实现垃圾回收orm
虚拟机栈:线程私有,虚拟机栈是一个栈结构的空间,当每个方法开始执行的时候都会在虚拟机栈中来开辟一个栈桢,栈帧主要存储方法执行时的局部变量表,操做数栈,动态连接以及方法出口等,当方法执行完毕后栈帧会被回收,一个方法从开始执行到执行结束对应了,栈帧从入栈到出栈的过程,当线程申请一个超出虚拟机规定上限的栈空间时就会出现StackOverFlowError,当栈没法再为新的方法分配栈帧又没法继续扩展时则出现OutOfMemory.对象
本地方法栈:线程私有,和虚拟机栈相似,区别是本地方法栈为本地方法服务,本地方法是指用native关键字修饰,用C语言实现的方法,主要是用于弥补Java不方便的实现的一些功能,能够直接和系统对接.一样会出现上面两种错误接口
程序计数器:线程私有,主要存储虚拟机下一条要执行的指令地址,字节码解释器就是经过改变程序计数器的值来选取下一条要执行的指令,分支,循环,跳转,异常处理都要依赖程序计数器来实现,若是正在执行的方法为本地方法,则程序计数器的值为null,而且本区域是虚拟机惟一没有规定OutOfMemory的区域生命周期
以上线程共享区域生命周期随着虚拟机的建立而建立,随着虚拟机的消亡而消亡.线程私有的区域随着线程建立而建立,随着线程的消亡而消亡.内存
好了,就先到这里吧,总感受有点少,之后再详细写一下