JVM学习笔记(一):JVM整体体系结构

前言

  第一次写博客, 有点小激动。博客本意是为了整理自己学习的思路,建立知识体系,不像其他大佬的博客会对知识进行深入剖析。
  我不想学了很多,最后都是知识碎片,别人一问起来某个概念,自己貌似知道一点,但是讲不清楚到底是个什么东西,细节知识倒是零零碎碎知道一些,这和没学感觉没差别。
  话不多说,最近在看深入理解java虚拟机这本书,整理一下学习思路,做点笔记,权当纪念看书的美好时光。

JVM是什么?

  说起来学过JVM,那么JVM是什么呢?
定义: JVM是java虚拟机的缩写,是一个虚拟出来的计算机平台
作用: 屏蔽计算机底层操作系统的信息,使得java程序只要编译成class字节码文件即可。class文件在JVM上运行,最终生成具体操作系统的机器指令。即所谓的“一次编译,到处运行”的保证。
延伸: 上面的是简短解释(别人问你,你首先要会用简单的语言跟别人说清楚吧。。)。延伸部分表示自然地联想出来。既然是计算机,麻雀虽小,五脏俱全。得有自己的指令集—字节码指令集,得有自己的硬件结构划分吧-----堆,虚拟机栈,本地方法栈,方法区,程序计数器等寄存器等等。

常见缩写解释:JRE/JDK/JVM

  这些缩写用英文记忆效果更佳。
JRE: java runtime environment(java运行时环境),顾名思义,java程序想要运行,就得以JRE为运行环境。
JDK: java development kit,是听得最多的,但是你真的知道它是什么吗????一套程序工具包,用来编译,调试java程序。震惊的是,它自己也是java程序。那么好了,它自己也得在java环境下运行吧,所以,我们常常看到JDK安装时,也会有JRE目录。
JVM: java virtual machine。刚才已经解释过了,不过,有没有发现,刚刚说JRE是java运行环境,但是java不是也在jvm中运行吗???没错,JVM是JRE的一部分,真神奇。
JVM学习笔记(一):JVM整体体系结构

JVM整体体系结构

  终于到了正题。先上图

JVM学习笔记(一):JVM整体体系结构

  声明所有的图都是我盗的,因为懒。上面整体体系结构图中还少了一个垃圾收集器,作用于内存区域,网上找不到画的完整的图。

体系结构各部分简介

  依然秉持着大道至简的原则,首先要能一句话说清楚每个部分是什么,做什么,解决什么问题的。至于怎么做,实现原理,技术细节,后面再深入学习。
class文件: 通常是java编译器(JDK)编译.java程序。
  延伸: 注意,上面说的通常,而不是仅仅。其他的如动态代理,常见的ZIP包(JAR,WAR),甚至你学了class文件结构后,自己手工纯天然制作一个都可以!
类加载系统: 将class文件加载到JVM的存储区域中。
  延伸:&emsp系统。。。那就有很多了,类加载过程,类加载器,双亲委派机制,打破这个机制,为什么要打破,你说加载到存储区域了,到哪块区域了?
java运行时数据区: 特别注意是运行时。是JVM对内部存储区域的一种划分方式,从逻辑存储上来支持class文件的运行。包括堆,方法区,程序计数器,虚拟机栈,本地方法栈。
  延伸: 每个区域有什么功能,相关参数,OOM的发生等
垃圾收集器: 对JVM内存进行回收,是JVM内存自动回收的基础。这也是java与C语言的一个重要区别,即不需要程序员自己手动分配和释放内存空间。
  延伸: 之所以说回收JVM内存,而没有说堆,是因为不仅仅是堆区域,方法区也有可能会被回收,这与具体内存实现策略有关,后面的文章会详细说。此外,垃圾回收包括几个大的部分,首先,你要回收我,你得给我一个理由吧—对象存活判定算法,然后,你得让我挣扎一下吧-----标记过程,finalize方法。再然后,你回收得有回收算法吧,不然逼格不高啊,----垃圾回收算法,你这么多算法不能是零散的,得有个容器吧-----垃圾收集器。最后是与垃圾收集相关的内存分配和内存回收。
执行引擎: 执行装载的类中的字节指令。
  延伸: 执行原理,执行过程,对应的数据结构等
本地方法: 本地方法,native method,java调用本地非java语言编写的程序的接口。即一个非java语言的程序在java中看起来应该是什么样子的。
  延伸: native关键字的使用,特征?为什么要使用本地方法?本地方法是怎样跑起来的?