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