面试题之 JVM 你熟悉吗?

主要是讲 Hotspot JVM

一、什么是 JVM

JVM 是一个 Java 代码假想的计算机,包括一套字节码指令集、一组寄存器、一个栈、一个堆、一个垃圾回收器、和一个存储方法域。

1、java 源文件通过通过 javac 语言编译器编译成 .class 的字节码文件。

2、 JVM 的解释器编译成特定机器上的机器码。

Java 的解释器在各个机器上不同,所以 Java 才可以跨平台

编译型语言和解释型语言

看到个有趣的例子,比如你想吃饭

1、编译型语言,就是直接把饭做好,你直接吃。并且是你想吃饭随时就在那

2、解释型语言,就是把菜弄好吃火锅,你想吃需要等他一点一点煮,熟一点吃一点

所以有编译型语言快与解释型语言

当一个 Java 程序开始运行 JVM 虚拟机就开始实例化,多个程序就会出现多个虚拟机。多个虚拟机实例之间数据不共享。

二、JVM 的内存模型

线程私有的区域:与线程同生共死,每个线程都与操作系统的本地线程直接映射。

线程共享区域:随虚拟机启动/销毁

直接内存:并不受 JVM 管理,但是 Java 还是会去调用。比如 I/O 很多方法就是通过函数调用这片区域。

2.1 程序计数器

        一块较小的内存空间,是当前线程所执行的字节码的行号指示器,每条线程都有自己的程序计数器。

2.2 虚拟机栈

         是 Java 执行方法的区域。每一个方法在执行前都会创建一个栈帧,会存入这个方法的变量、操作数栈、动态链接、方法出口等信息。方法从被调用到执行完成对应着一个栈帧在虚拟机栈从入栈到出栈的过程。

        栈帧随着方法的调用而创建,随着方法的结束而销毁,用来存储数据和部分过程结果。同时也被用来处理动态链接、方法返回值和异常分派。

2.3 本地方法区

        本地方法区和 Java Stack 作用类似,区别在于虚拟机栈服务于 Java 线程,本地方法栈服务与 Native 方法。HotSpot VM 把本地方法栈和虚拟机栈合成了一个

2.4 堆

        堆是 Java 的运行时数据区,是被线程共享的一片区域。创建对象和数组都保存在 Java 堆内存中,也是垃圾回收最重要的内存区域。因为采用了分代收集算法,因此堆分为了年轻代和老年代。

2.5 方法区/永久代/元空间 

        即我们常说的永久代,用于存储被 JVM 加载的类信息、常量、静态变量、即使编译器编译后的代码、Meta 等数据。HotSpot 把 GC 分代收集扩展至方法区,即使用 Java 堆的永久代来实现方法区,这样也可以通过 GC 来管理这片内存。主要是回收常量池和类型卸载

Java8 中,永久代已经被移除,被一个称为“元数据区”(元空间)的区域所取代。元空间

的本质和永久代类似,元空间与永久代之间最大的区别在于: 元空间并不在虚拟机中,而是使用 本地内存 。因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入 native memory, 字符串池和类的静态变量放入 java 堆中,这样可以加载多少类的元数据就不再由 MaxPermSize 控制, 而由系统的实际可用空间来控制。

        运行时常量池也是方法区的一部分,是存储 class 类里面编译期生成的各种字面量和符号引用。

三、总结

  • JVM 是一个假象的计算机,主要用于运行 Java 字节码文件
  • JVM 包含类加载器、执行引擎、运行时数据区、本地方法接口等
  • JVM内存主要分为线程私有、线程共享和直接内存。私有又分为程序计数器、虚拟机栈、本地方法栈;共享的分为方法区和堆。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值