(一)JVM初步介绍:

在了解JVM之前,我们要思考一个小问题,

1.谈谈你对java的理解:

面试过程中,我们会遇到面试官 广度

  • 面向对象 (继承 封装和多态)
  • 平台无关性
  • GC (不同于C++,java可以自动回收内存)
  • 语言特性
  • 类库
  • 异常处理

不难发现,我们谈对java的理解可以参照面向对象思想面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式,java的每一个特性都可以看成是java中的一个对象,不同的对象中有不同的方法和数据,而对于平台无关性这一特性,JVM则可以看作是其中的主方法

JVM的广度定义:JVM是JavaVirtualMachine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 主流虚拟机

2.平台无关性如何实现:

如果把java看成是一个工厂,java的平台无关性则是一个小的车间,那么JVM即可看成一个机器,那么这个问题就再问这个车间是如何运转的;

java源码首先编译为源码,之后由不同的平台的JVM进行解析,java在不同的平台上运行时不需要进行重新编译,java虚拟机在执行字节码时,把字节码转化为不同平台上的指令

过程为 : java文件–>class文件–>转化成特定平台的执行指令(JVM解析)

这段话我们可以理解为在一个专用车间将原料转化为机器所需的通用原料,然后将通用原料交给其它不同车间的机器(JVM)处理,即不需要再 在制作工具的车间重新进行原料的转换
拓展:javac可对程序进行编译,其先对于程序的语法进行检测,编译完后生成class文件,class文件保存的是java文件翻译成的二进制字节码,如下图:

Java的字节码示例如图所示:

额外:

为什么JVM不直接将源码解析为机器码执行,而是先编译为class文件之后在执行:

  • 准备工作:如果不编译为class文件,则每次执行都要进行各种检查,整体性能会受到影响
  • 兼容性:可以将别的语言解析为字节码,可以更好的体现软件的兼容性

对于这个问题我们也可以这样理解,java程序的运行是一个造纸的过程,我们可以将执行java命令得到的结果看成是最终得到的不同的纸,如果将java文件看作是木头等生产原料,那么class文件就相当于木浆,我们要先在一个专用车间(即为javac进行编译)将各种原料转化为造纸用的木浆,只有转换后我们才能直接将木浆送到各个专用车间加个得到不同的纸张(专用车间即为不同平台上的JVM),
如果我们省去这一步,而是直接将木头等原料送到各种车间进行加工,我们就要在各种车间添加将原料变为木浆的工具,这一过程会造成效率的下降,使得在造纸的过程还要多一步原料转化的过程,

这一过程很好的体现的java面向对象的思想,将不同的方法交由专用的对象处理,就像生活中我们要尽量把不必要的事情交给专业的人处理,不但能很好的效率,我们还能得到更优质的体验;同时这一过程作为JVM供应链的一环,为java的兼容性提供保证,不难知道,兼容性是一个app,一款硬件,乃至一个操作系统能够推广并发挥最大作用的保证,这个过程很好的保证的java文件只编译一次,但可以在不同的平台执行无数次,符合软件的中庸之道

(二)深入理解JVM:

在了解完java的平台无关性,JVM的运行流程等,我们还需要了解JVM运行具体的过程

我们先看一下java虚拟机的定义:
虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java虚拟机屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

  • 我们可以总结两个优点:
    1.屏蔽底层操作系统的不同
    2.减少基于原生语言开发的复杂性

对于这两个优点,我们可以不太容易了解到其中的内涵,下面我们先了解JVM的一些运行原理:

JVM如何加载.class文件:

要回答这个问题,我们要先了解JVM的内存结构,即为机器的整体的构造,其中大致可分为四个部分;

完整结构:

  • class loader:根据特定形式,加载class文件到内存(这里看成是机器的原料进入口,把符合要求的原料放入机器当中)
  • Rxecution Engine:对命令进行解析(这一步可以看成是对原料进行加工,是造纸前的一个准备工作)
  • Native Interface:融合不同的开发语言的原生库为java所用(这一部分可以看成调取其它不同的原料(即为其它语言,例如C++,有些时候C++的效率反而更高,JVM的内核就是由C++编写)的过程,可以理解为,为了得到不同功能的纸张,我们要添加一些其它的原料提高质量)
  • runtime data Area: JVM的内存空间结构模型(我们所写的java文件最终都会被加载到这里,因此可以把此部分看成存储原料的引擎)
    为了在生产过程中保证生产能够有序的进行,我们还要在不同的是时间对于生产进行监督,即为反射:

反射机制(RC):

  • java反射机制的定义如下:

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键
即为机器如何监视,保证生产正常进行

  • 反射的优点:

反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。
其次,通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类。
再次,使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。
最后,反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。
反射的具体机制我们以后在深究…

下面我们要了解一下机器的具体造纸过程

类从编译到执行的过程:

原料从制作到变为产品的过程;

  • 编译器将Robet.class文件编译为Robet.class字节码文件
  • classLoader将字节码转化为JVM中的class(Robet)对象
  • JVM利用Class(Robet )对象实例化为Robet对象

classLoader(类加载器):

可以看作是机器的引擎,Classloader 类加载器,用来加载Java类到 Java 虚拟机中的一种加载器。

JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现的,它负责加载核心JavaClass(即所有java.*开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由BootstrapClassLoader加载;其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),ApplicationClassLoader负责加载应用程序自身的类。

当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。

这一过程我们可以将classloader看作是机器的引擎,而三个
classLoader的种类既可以看作是引擎的内部不同处理系统,由一个核心部分搭配另外两个部分完成所有功能;

  • 1.BootstrapClassLoader:C++编写,加载核心库;
    BootstrapClassLoader是顶级加载器,默认加载的是%JAVA_HOME%中lib下的jar包和class类文件,他也是ExtClassLoader的父类,但是不是继承(extends)关系,是ExtClassLoder中有一个parent变量是BootstrapClassLoader

  • 2.ExtClassLoader:java编写,加载拓展库javax
    ExtClassLoader扩展类加载器,负责加载%JAVA_HOME%中lib/ext文件下的jar包和class类文件,ExtClassLoader加载器是AppClassLoader的父类,当然也不是继承(extends)关系,也是类中有parent变量

  • 3.AppClassLoader:java编写,加载程序所在的目录
    AppClassLoader(应用程序加载器/系统类加载器)是自定义加载器的父类,负责加载classPath下的类文件,平时引用的jar包以及我们自己写的类都是这个加载器进行加载的,同时AppClassLoader还是线程上下文加载器,如果想实现一个自定义加载器的话就继承(extends)ClassLoader来实现.

  • 4.自定义classloader
    这个以后会探讨…

(三)额外:

1.classLoader双亲委派机制:

引擎内部运行的过程有两个方式:自底向上和自上向下(可以看作为引擎在生产过程中的索所要遵循的规则)

类是先向上委派之后向下查找

  • 1.自底向上:AppClassLoader是加载我们自己编写的class类的,当他遇到一个新的class类的时候,不会直接进行加载,而是向上委派给ExtClassLoader,向上委派就是去查找ExtClassLoader是否缓存了这个class类,如果有则返回,如果没有则继续委派给BootstrapClassLoader,如果BootstrapClassLoader中缓存有则加载返回

可先参考一下loaderclass方法的源码;

  • 2.自上向下:开始进行向下查找了,就意味着当前class类向上委派到BootstrapClassLoader时还是没有该类的缓存,此时BootstrapClassLoader会查找加载自己路径也就是%JAVA_HOME%/lib下的jar与class类文件,如果有则加载返回,没有则继续向下查找。ExtClassLoader也是做同样的操作。查找加载ExtClassLoader对应路径的文件,如果有则加载返回,没有则继续向下到AppClassLoader查找加载,AppClassLoader是加载classPath也就是我们程序员自己编写的class类,如果AppClassLoader找不到则会抛出找不到class类异常

使用双亲委派机制加载类的原因:
1.这样做的原因主要是为了安全,避免程序员编写类动态替换Java的核心类比如说String,
2.同时也是避免了相同的class类被不同的ClassLoader重复加载

2.类的装载过程:

可以理解为得到的纸张的方式;

类的装载过程:

  • 加载:加载class文件字节码
  • 链接:校验,准备,解析;
  • 初始化

加载的方式:
1.隐式加载:new
2.显示加载:loadclass,forname

具体区别:

(一)JVM的简单了解--java的平台无关性相关推荐

  1. Java的平台无关性是怎么实现的?

    前言 在接触Java的时候,经常能听到Java的特点之一就是:"一次编译,到处运行(Write Once, Run Anywhere)".这种特点对于Java来说,有什么好处呢?J ...

  2. java解析ceb文件_什么是Java的平台无关性

    Hello,各位小伙伴是不是对于Java面试很头疼呢? 我以前跟你们一样也是如此,今天我给大家分享一些经验与技巧. 首先回顾一下,上一篇文章,我们说到了对JAVA的理解,那么这一节课开始我们将重点分析 ...

  3. 深入Java虚拟机(2)——Java的平台无关性

    一.平台无关性的好处 Java技术在网络环境下非常有用,其中一个关键理由是,用Java创建的可执行二进制程序,能够不加改变地运行于多个平台. 这样的平台无关性随之带来许多的好处.这将极大地减轻系统管理 ...

  4. Java是如何实现平台无关性(跨平台)的?

    相信对于很多Java开发来说,在刚刚接触Java语言的时候,就听说过Java是一门跨平台的语言,Java是平台无关性的,这也是Java语言可以迅速崛起并风光无限的一个重要原因.那么,到底什么是平台无关 ...

  5. Java如何实现的平台无关性的(面试必看)

    想要查看前面的笔记请翻阅我的CSDN博客,作者码字不易,喜欢的话点赞,加个关注吧,后期还有很多干货等着你! 相信对于很多Java开发来说,在刚刚接触Java语言的时候,就听说过Java是一门跨平台的语 ...

  6. Java是如何实现平台无关性的

    相信对于很多Java开发来说,在刚刚接触Java语言的时候,就听说过Java是一门跨平台的语言,Java是平台无关性的,这也是Java语言可以迅速崛起并风光无限的一个重要原因.那么,到底什么是平台无关 ...

  7. Java修炼之路——基础篇——平台无关性

    Java如何实现平台无关性? 首先说无论是哪种语言,都需要经过操作系统和CPU来完成程序的运行.平台无关性指的是程序不会因为操作系统和处理器的不同而不能运行或者发生运行错误.而不同的CPU和OS组成的 ...

  8. 浅谈Java平台无关性

    为什么Java要支持平台无关性 众所周知,Java是平台无关的语言,那么Java为什么要支持平台无关性,总结一下,有如下几点 支持多变的网络环境.如今是一个互联网的时代,网络将各种各样的计算机和设备连 ...

  9. 关于Java平台无关性你该知道这些

    文章目录 一.什么是平台无关性 二.平台无关性的实现 我们举个小例子 三.为什么JVM不直接将源码解析成机器码去执行 一.什么是平台无关性 Java语言是一款跨平台的语言,不管是在windows还是在 ...

最新文章

  1. 100个vc小项目开发:二、一步一点设计音乐播放器 [I]
  2. python update()
  3. bash shell while语法
  4. 区块链学堂(2):最简单的智能合约
  5. flume案例-flume级联-配置文件编写
  6. 深入理解RCU | RCU源码剖析
  7. Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php )...
  8. python做定时任务的方式及优缺点_Python3-定时任务四种实现方式
  9. 《那些年啊,那些事——一个程序员的奋斗史》——30
  10. 【VRP问题】基于狼群算法WPA求解带时间窗车辆路径规划问题(VRPTW)matlab源码
  11. Redis安装(Windows环境下Redis安装)
  12. mysql全量备份脚本_mysql全量备份脚本
  13. Python安装word2vec环境依赖
  14. 300字美文摘抄加赏析
  15. 【题解】天梯赛练习集 L1-059 敲笨钟
  16. 【一种利用插值验证的FL隐私保护框架】VFL: A Verifiable Federated Learning
  17. 【泛函分析】Riemann-Stieltjes 积分
  18. 白帽子学习——Metasploit渗透测试指南
  19. 磁场强度单位和磁感应强度单位转换
  20. 微信小程序 ECharts 水球图

热门文章

  1. springboot项目在测试文件夹报空指针异常
  2. 一键安装5个系统方法,简单易学轻松上手
  3. 小目标检测small object detection
  4. iOS简单实现图片模糊渐变效果
  5. 服务器环境搭建(裸机到应用)
  6. Locust入门教程
  7. 使用Gmail邮箱攻略
  8. Excel技巧大全之具有多个搜索条件的索引匹配
  9. 四种常见的ps怎么模糊背景的方法
  10. 【语音合成】基于matlab线性预测共振峰检测和基音参数语音合成【含Matlab源码 562期】