大家好我是Eric,工作三年了,第一次写博客,也不知道从哪开始写起,也不知道该怎么写,就把我学习理解的jvm分享一下,如有不理解不正确的请各位大神留言讨论。
Jvm的组成结构
包含两大子系统:类加载器,跟执行引擎;包含两大组件:本地接口,运行时数据区。
Jvm作用
首先我们的编译器会把我们的java代码转换成字节码,类加载器(classLoader)会把我们的字节码加载到我们的内存中,将其放入到我们的运行时数据区的方法区中,而字节码只是jvm的一套指令规范,并不能直接交给其他系统去执行,所以我们的执行引擎就出来了,通过执行引擎(execution engine)将字节码翻译成底层系统指令,在由cpu区执行,而这个过程中需要调用第三方语言的本地接口(natice interface)来实现整个程序的功能。
运行时数据区
在这单独说一下我们经常说的jvm内存,其实就是我们的运行时数据区。Java虚拟机规范规定的区分了5个部分:
程序计数器:当前线程执行的字节码行号指示器,字节码解析器通过改变这个计数器的值,来选取下一条要执行的指令。
java虚拟机栈:用于存储局部变量表、操作数栈,动态链接、方法出口等信息。
本地方法栈:与虚拟机一样,只是虚拟机栈是服务java方法,而本地方法栈是为虚拟机调用native方法服务的;
java堆:java虚拟机中内存最大的一块,被所以线程共享,几乎所有的对象实例都在这里分配内存。
方法区:用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
jvm中对象的内存空间分配
1.指针碰撞:如果java堆的内存是规整的,及所有的内存放在一边,而空闲的放在另一边,分配空间的指针指示器向空闲的内存移动一段与对象大小相等的距离。
2.空闲列表:如果堆内存空间不规整,则需要由虚拟机维护一张列表来记录那些空间是可用的,这样在分配内存空间的时候可以从列表中查询到足够的内存分配个对象,并在分配后更新列表记录。
因篇幅问题不能全部显示,请点此查看更多更全内容