后端技术面试 38 讲
李智慧
同程艺龙交通首席架构师,前 Intel& 阿里架构师,《大型网站技术架构》作者
37373 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
不定期加餐 (1讲)
后端技术面试 38 讲
15
15
1.0x
00:00/00:00
登录|注册

03丨Java虚拟机原理:JVM为什么被称为机器(machine)?

程序计数寄存器
Java栈
方法区
G1垃圾回收器
CMS并发垃圾回收器
Parallel并行垃圾回收器
Serial串行垃圾回收器
复制
压缩
清理
运行时数据区
类加载器
JIT即时编译
解决问题的思路
JVM的配置参数
垃圾回收器
分代回收
垃圾回收方法
可达性分析算法
线程安全与Java栈
Java程序运行过程
JVM的构造
JVM屏蔽底层系统差异
Java跨平台特性
思考题
小结
JVM的垃圾回收
JVM为什么被称为机器(machine)?
Java虚拟机原理

该思维导图由 AI 生成,仅供参考

人们常说,Java 是一种跨平台的语言,这意味着 Java 开发出来的程序经过编译后,可以在 Linux 上运行,也可以在 Windows 上运行;可以在 PC、服务器上运行,也可以在手机上运行;可以在 X86 的 CPU 上运行,也可以在 ARM 的 CPU 上运行。
因为不同操作系统,特别是不同 CPU 架构,是不可能执行相同的指令的。而 Java 之所以有这种神奇的特性,就是因为 Java 编译的字节码文件不是直接在底层的系统平台上运行的,而是在 Java 虚拟机 JVM 上运行,JVM 屏蔽了底层系统的不同,为 Java 字节码文件构造了一个统一的运行环境。JVM 本质上也是一个应用程序,启动以后加载执行 Java 字节码文件。JVM 的全称是 Java Virtual Machine,你有没有想过,这样一个程序为什么被称为机器(Machine)呢?
其实,如果回答了这个问题,也就了解了 JVM 的底层构造了。这样在进行 Java 开发的时候,如果遇到各种问题,都可以思考一下在 JVM 层面是如何的?然后进一步查找资料、分析问题,直至真正地解决问题。

JVM 的组成构造

要想知道这个问题的答案,我们首先需要了解 JVM 的构造。JVM 主要由类加载器、运行时数据区、执行引擎三个部分组成。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

JVM的垃圾回收是Java虚拟机管理内存的重要功能之一。通过可达性分析算法,JVM能够识别并清理不再被使用的对象,释放内存资源。垃圾回收主要有清理、压缩和复制三种方法,同时采用分代回收策略,将堆空间分为新生代和老年代,以提高垃圾回收效率。文章还介绍了不同类型的垃圾回收器,包括串行、并行、并发和G1垃圾回收器,以及它们的适用场景和特点。了解JVM的基本构造和垃圾回收原理有助于解决Java开发中的各种问题,如内存溢出、栈空间不足等,同时也能优化程序性能。通过思考和分析问题,开发者可以更深入地理解JVM和整个计算机的原理体系,提高对Java开发的认识和领悟。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《后端技术面试 38 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 幸福来敲门
    老师,内存溢出和内存泄漏有什么区别,以java为例??

    作者回复: 内存溢出是说程序需要申请的内存超过了JVM当前可以分配的最大内存,溢出。 内存泄漏是说期望被回收的内存对象没有被回收,泄漏。 内存泄漏持续发生,很可能引起内存溢出。

    2019-11-22
    2
    64
  • KL3
    请问老师,关于类加载,对象方法和类方法都是放在方法区吗?

    作者回复: 可执行的代码都在方法区。 对象是类的实例,实例变量在堆中,同一个类的所有对象实例的方法只有一份,在方法区。

    2019-11-22
    4
    8
  • 乘坐Tornado的线程魔法师
    存活对象从From区复制到To区之后,在交换名称之前,是不是要把From区的那些不存活对象全部回收?(保证交换名字之后,To区永远是空白的)

    作者回复: 内存空间只需要标记是空闲就可以,交换以后To区就已经是空白的了。

    2019-11-22
    4
    5
  • 乘坐Tornado的线程魔法师
    操作系统处理线程栈这个场景是不是可以想象成,高并发场景下,每一个请求都要压入操作系统的线程栈,请求返回后,执行这个请求的线程才能从操作系统的线程栈中出栈?

    作者回复: 每个线程有自己的线程栈,用来管理方法的局部变量。而线程本身的管理不需要用栈。 事实上,线程是使用线程池管理的,请求到来,就到线程池中申请分配一个空闲线程,请求处理完,线程放回到空闲线程池中。

    2019-11-22
    5
  • WoLoong
    老师你好 1.为什么新生代要设置3个区域呢?只有from和to不行吗? 2.多线程执行的时候,栈帧在栈上如何分配空间的,是分多个java栈吗?

    作者回复: 1 因为一个对象在from和to之间多次拷贝,然后才会放入老年代。 2 每个线程有自己的线程栈。

    2019-11-23
    7
    4
  • 我爱布丁
    老师,第一讲中谈到当操作系统载入编译后程序时,会在内存中建立进程,划分代码段,堆,栈等。那么当操作系统运行JAVA虚拟机加载类文件时,在虚拟机中的Java堆,栈是否会直接map到JAVA虚拟机进程的堆,栈呢?从操作系统看一个JAVA虚拟机进程,和一个普通的编译后程序进程结构上有区别吗?

    作者回复: 虚拟机内部的堆和栈不会map到操作系统的堆和栈,这样才能跨平台。 操作系统看JVM就是一个普通进程。

    2019-11-22
    4
    4
  • 李怡尚
    文中垃圾回收只说了堆内存的回收,没有说方法区和栈内存的回收?

    作者回复: 方法区是堆的一部分 栈是线程私有的,不需要回收

    2021-03-15
    2
  • 花不不
    如果在方法内创建了一个对象实例,这个对象实例信息将会被存放到堆里,而对象实例的引用,也就是对象实例在堆中的地址信息则会被记录在栈里。 - - - - 堆里面存储的对象实例在复制的过程中地址信息不会变化吗?如果变化了怎么通知到java栈呢

    作者回复: 可以粗暴理解:有专门机制记录新旧地址。

    2021-02-21
  • 席席
    老师,你说Service和Dao都被设计成无成员变量,所以线程安全,这里的Service和Dao指的是接口还是实现类,如果是实现类那么必然会有成员变量呀,有点疑惑🤔

    作者回复: 实现类。 成员变量也是无状态的,递归无状态~

    2021-02-18
  • miracle
    虽然这个对象被放置在堆中,但是这个对象不会被其他线程访问到,也是线程安全的。 请问下,多个线程都可以访问这个方法,进而可以操作堆中的对象,为什么是线程安全的

    作者回复: 每个线程都可以访问这个方法,如果在这个方法内创建一个对象,那么就意味着“每个”线程都会“自己”创建一个对象。线程之间不会访问彼此的对象。

    2019-11-23
    4
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部