前言: jvm是一门一个比较深奥且广泛的知识点,并不是三言两语能够理解透彻的,网络上也有很多相关文章,本篇仅仅是以入门的角度去揭开jvm的面纱,此文章仅代表鄙人的总结和理解,如有错漏,欢迎指正...
JVM是什么?
JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM 是运行在操作系统之上的,它与硬件没有直接的交互。
引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译,“一次编译,到处运行”。过程为:
Java 源文件—->编译器—->字节码class文件—->JVM(类加载机制)—->机器码
JVM包括三大方面:
1、java代码执行(编译class、装在calss、执行class)
2、内存管理(内存空间、内存分配、内存回收、内存分析)
3、线程资源同步和交互机制
JVM 类加载机制
虚拟机设计团队把加载动作放到 JVM 外部实现,以便让应用程序决定如何获取所需的类,
JVM 提供了 3 种类加载器:启动类加载器、扩展类加载器、应用程序类加载器
双亲委派
当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。
采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object 对象。
JVM的内存结构(口诀:栈变量、堆对象、方法类)
栈:
存储局部变量以及方法调用的中间结果及返回值,每个线程都有单独的栈(基本数据类型int、double、short等是储存在内存栈里的)
堆:
实例化的对象存在内存里(引用型数据类型String、Integer、Long等是储存在内存堆里的)
方法区:
缓存,类,字段,方法等
JAVA是如何实现跨平台的?
我们编写的Java源码,编译后会生成一种.class文件,称为字节码文件。Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。JVM是一个”桥梁“,是一个”中间件“,是实现跨平台的关键
注意:跨平台的是Java程序,不是JVM。JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM
结语:以往都是看别人的博客进行学习技术,其中不乏有精华博客也有吊儿郎当的CV大法文章,所以决定将自己所学所用所整理的知识分享给大家,主要还是想为了后浪们少走些弯路,多些正能量的博客,如有错漏,欢迎指正,仅希望大家能在我的博客中学到知识,解决到问题,那么就足够了。谢谢大家!(转载请注明原文出处)