为了账号安全,请及时绑定邮箱和手机立即绑定

深入理解JVM之基本构架

标签:
Java
JVM详解之 基本构架

需要小伙伴使用图形化工具【jvisualvm】帮助我们分析。

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

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消