JVM内容(简化版)(一)
`
文章目录
前言
新手笔记,写来防止我的偷懒(内容如有出错,还望各位大佬多多指出)
提示:以下是本篇文章正文内容,下面案例可供参考
一、JVM是什么?(6大组件)
JVM(JavaVirtualMachine),简称java虚拟机。
JVM运行=字节码指令(套)+寄存器(组)+栈(个)+堆(个)+存储方法域(个)+GC(Garbage Collection)(个)
ps:词汇拓展
字节码:在java里,能够被JVM理解的代码叫字节码(扩展名为.class文件)
字节码指令:这里是指包含JVM操作所对应的数据类型信息(ps:Java虚拟机的指令均是一个字节长度的,由操作码+操作数组成)
寄存器:存储二进制代码,由具有存储功能的触发器组合起来构成的。(1个触发器能存放1位二进制代码)
栈(堆栈):
数据结构中:是一种运算受限制的线性表(一种数据结构,先进后出,后进先出)
操作系统中:指内存空间,是程序运行时自动拥有的一小块内存,大小在编译期(JVM内存没有任何分配,只会把 java源文件 编译成 .class文件)时由编译器参数决定
堆:
数据结构中:堆是满足父子结点大小关系的一种完全二叉树
操作系统中:是指内存空间,为按需申请,动态分配,可以理解为当前可以使用的空闲空间
存储方法域:一个存储方法的区域
GC(垃圾回收):一个机制,让java程序员不再考虑内存管理,且只有对象的引用才有“作用域”,可以有效防止内存泄漏(通常作为一个单独的低级别的线程运行)
二、JVM拿来干什么?
1.进行java代码的执行(3步曲)
编译成.class文件+装载class(用ClassLoader)+执行class(解释执行+编译执行)
ps:
编译成.class文件:Java源文件——编译器(经过)——字节码文件(.class)
装载class过程:加载——链接(验证,准备,解析)——初始化
解释执行:应用解释器把代码一句一句解释成机器能辨认的二进制代码,即解释一句,执行一句
编译执行:源程序——编译器(这里值的是将源程序翻译成指标机器指令)——机器指令(即:将所有源代码一次性转换成二进制指令,生成一个可执行程序)
2.进行内存的管理(3个管理部分)
内存空间+内存分配+内存回收
内存空间
PC寄存器+本地方法栈+方法栈+堆+方法区
内存分配
堆上分配+TLAB(Thread Local Allocation Buffer)分配+栈上分配
内存回收
算法回收+Sun JDK回收
3.进行线程资源的同步和交互机制
线程资源同步机制
Synchronized的实现机制+lock/unlock的实现机制
线程交互机制
正常唤醒:JVM通过wait/notify/notifyAll来支持等待和唤醒的需求
虚假唤醒:在Sun JDK中,object.wait()还有可能被虚假唤醒,即原本只能唤醒一人,现在唤醒了两人,两个人都有锁,但只有一件物品能被拿到(double check)
4.通过JVM可以让java跨平台
Java源文件经历的过程:
Java源文件——编译器(经过)——字节码文件——JVM(经过)——机器码(特定机器上的机器码,一般指机器指令码,也就是计算机能看懂的一组二进制数)
由上述可知:因为当程序开始运行的时候,JVM开始实例化,虽然各个平台解释器不同,但是最终都要经过相同的JVM的才能变成机器码。(同时,多程序启动会存在多个虚拟机实例,但是实例之间数据不互通)
总结
以上就是今天要讲的内容,本文仅仅简单介绍了JVM的简化版内容,后续将会继续对相关模块进行补充