Java虚拟机各个部分说明

首先认识一下整体结构:内存结构图
.class文件:将编写的.java文件经过编译器编译后生成的文件。

类加载器:类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。

方法区:保存类的信息、常量池、静态变量、编译后的代码文件。
方法区又叫Non-Heap(非堆),方法区是一个规范,JDK7以前方法区指的是永久代,从JDK7(字符串常量池等从永久代移除)开始渐进式的移除了永久代,JDK8开始方法区指的便是元空间了。Metaspace(元空间)和 PermGen(永久代)都是对 JVM规范中方法区的一种落地实现。方法区线程共享,与JVM共存亡,空间大小可以调节。方法区也存在垃圾回收机制,主要回收两部分内容:常量池中废弃的常量和不再使用的类型。

堆区:是通过new关键字创建的对象存放在堆中。线程共享,垃圾回收机制的只要管理区域,空间大小可以调节。

程序计数器:用于记录下一条Jvm指令的执行地址。JVM会通过程序计数器记录下一条需要执行的JVM指令的地址(比如第一行的0),然后交给解释器解析为机器码,最后交给cpu(只能识别机器码),完成一行的执行。想要执行下一行,继续让JVM的程序计数器记录下一条地址,再交给解释器解析后给cpu,以此类推执行结束。线程私有,不会存在内存溢出。

虚拟机栈:虚拟机栈是每个线程运行所需要的内存空间,每个栈中由多个栈帧组成,每个线程中只能有一个活动栈帧(对应当前正在执行的方法),所有栈帧都遵循后进先出,先进后出的原则。栈帧是每次调用方法时所占用的内存,在栈帧中保存的内容参数、局部变量、返回地址。垃圾回收不涉及栈内存,因为栈内存是由方法调用产生的,当方法调用结束后会弹出栈。栈内存不是分配的越大越好,因为物理内存是一定的,栈内存越大,可以支持更多的递归调用,但是可执行的线程数会越来越少。存在内存溢出,两种情况:栈帧过多(无限递归);每个栈帧所占用过大。

本地方法栈:通过调用本地方法接口来操作系统功能。与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java 方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native 方法服务。

执行引擎包含解释器、即时编译器、垃圾回收器,
方法中的代码通过解释器执行,热点代码通过即时编译器执行,速度快。

垃圾回收机器(GC):是针对堆内存中没有引用的对象进行回收,可以手动也可以自动。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值