Java JVM怎么学习啊?从哪方面入手? JVM基础系列开篇:为什么要学虚拟机?

https://www.zhihu.com/question/20097631

一、JVM基础系列开篇:为什么要学虚拟机?

https://www.cnblogs.com/chanshuyi/p/jvm_serial_00_why_learn_jvm.html

接着我想聊聊我的第二个观点:学习虚拟机是为线上排查问题打下基础。我们知道我们一个 Java 应用部署在线上机器上,肯定时不时会出现问题。除去网络、系统本身问题,很多时候 Java 应用出现问题,就是 Java 虚拟机的内存出现了问题。要么是内存溢出了,要么是 GC 频繁导致响应慢等等。

那如何解决这些问题呢?首先,你必须学会看懂日志吧。那么你就必须要看得懂 GC 日志,这是 Java 虚拟机内容的一部分。你看懂了 GC 日志,那么你就得明白什么是年轻代、老年代、永久代、元数据区等,这些就是 Java 虚拟机的内存模型。你懂了 Java 虚拟机的内存模型,那你就得知道 Java 虚拟机是如何进行垃圾回收的,它们使用的垃圾回收算法是怎样的,它们有何优缺点。接下来就是各种垃圾回收器的特性。

你看,这一切东西都是相关联的。你想要解决线上的 Java 应用崩溃问题,那么你就必须学会 GC 日志。要看懂 GC 日志,就必须学习 Java 虚拟机内存模型。要看懂 Java 虚拟机内存模型,你就要学会垃圾回收机制等等。

二、到底什么是虚拟机

https://www.cnblogs.com/chanshuyi/p/jvm_serial_03_the_nature_of_jvm.html

系统软件无法通用是一个常见的问题。但使用过 Java 的同学都知道,Java 代码可以在服务端(Linux 系统)运行,也可以在 Windows 系统运行,但我们并没有生成多份不同的代码。所以 Java 语言是如何做到的呢?

与其他语言不同,Java 语言并不直接将代码编译成与系统有关的机器码,而是编译成一种特定的语言规范,这种语言规范我们称之为字节码。无论 Java 程序要在 Windows 系统,还是 Mac OSX 系统,抑或是 Linux 系统,它首先都得编译成字节码文件,之后才能运行。

但即使编译成字节码文件了,各个系统还是无法明白字节码文件的内容,这时候就需要 Java 虚拟机的帮助了。Java 虚拟机会解析字节码文件的内容,并将其翻译为各操作系统能理解的机器码。

简单地说,对于同样一份 Java 源码文件,我们编译成字节码之后,无论是 Linux 系统还是 Windows 系统都不认识。这时候 Java 虚拟机就是一个翻译官,在 Linux 系统上翻译成 Linux 机器码给 Linux 系统听,在 Windows 系统上翻译成 Windows 机器码给 Windows 系统听。这样一来,Java 就实现了「Write Once,Run Anywhere」的伟大愿景了。

猜你喜欢

转载自www.cnblogs.com/shay/p/12925626.html