JVM详解之 基本构架
需要小伙伴使用图形化工具【jvisualvm】帮助我们分析。
- 首先来看图,进行理解。
类加载器将【class】文件加载到方法区,如果是java程序,jvm会把main所在的类实例化并在虚拟机栈下开辟栈空间。如果是javaweb tomcat等应用服务器,应用服务器会加载。
在main之后,栈中就会添加栈帧,然后main可能会new 调用方法等等,new 就在heap中分配空间,在栈帧的局部变量表中添加引用地址;调用方法会新创一个栈帧。实际上,栈就是一个递归的过程,直到main执行完毕,最后程序结束。这个大致的过程请小伙伴们一定要理解。 - 具体分析————————————【①方法区】
在Class文件中除了类的字段、方法、接口等描述信息外例如:类的全限定名(类的全路径名) 类的直接超类的全限定名(如果这个类是Object,则它没有超类)这个类是类型(类)还是接口,类的访问修饰符,所有的直接接口全限定名的有序列表(假如它实现了多个接口) 包含但不限于这些内容。如果是做java开发了解到此,我认为足矣。开发虚拟机就只是常识。
在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中。
以上为个人看法和观点,如有不正之处希望谅解并欢迎指正。 - 具体分析————————————【②堆】
堆中主要就要讲解gc过程,在此只简单提一下,因为gc过程牵扯到内存分配和垃圾回收,这个问题完全需要另外详细解析。 - 具体分析————————————【③虚拟机栈】
每一个JVM线程都有自己的java虚拟机栈,这个栈与线程同时创建,它的生命周期与线程相同。一个方法一个栈帧,形参和局部变量同等对待,也在栈中分配空间。当方法执行完毕后,对应的栈帧立刻消失(包含里面的所有引用和局部变量)。而引用的实际变量(如果没有引用指向他的时候)则在gc的时候消失。 - 具体分析————————————【其他】
本地方法栈【native】可以类比虚拟机栈,只不过此栈中调用的方法都是本地方法。除此之外,其他的和虚拟机栈都类似。
而PC寄存器,也叫程序计数器【Program Counter Register】是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器。
每一条JVM线程都有自己的PC寄存器在任意时刻,一条JVM线程只会执行一个方法的代码。该方法称为该线程的当前方法(Current Method)如果该方法是java方法,那PC寄存器保存JVM正在执行的字节码指令的地址如果该方法是native,那PC寄存器的值是undefined。小伙伴们只要知道就可以了。 - jvisualvm可视化工具和jconsole工具
命令行窗口输入命令:【jvisualvm】
就会出现可视化工具,我是分析eclipse的堆栈,如图下:
第一次打开可能没有这么多工具,可以点击【工具>插件>可用插件】,选中,并【安装】。
然后我们就可以看到上面分析的一系列space面板。
命令行窗口输入命令:【jconsole】
使用jconsole工具查看各个区域的运行环境。 - 参考文献
[keycoding][8] [chenzhou123520][9]《深入理解java虚拟机》《实战Java虚拟机》
如有转载,请注明出处。
点击查看更多内容
35人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦