精华内容
下载资源
问答
  • 要精通java必看的经典书籍:Ajax中文手册(快速上手),hibernat培训,JavaScript源码大全 v1.0,Struts快速学习指南,全新java基础实践教程,Spring+in+Action中文版
  • 对于任何一门语言,想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历...

    对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。

    在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历了什么?每一步又是怎么执行的?执行原理又是什么?

    a20d1e596917ed8b1057b58122325329.png

    一、编写java源程序

    java源文件:指存储java源码的文件。

    先来看看如下代码:

    //MyTest被public修饰,故存储该java源码的文件名为MyTest

    public class MyTest {

    public static void main(String[] args){

    System.out.println("Test Java execute process.");

    }

    }

    //由于MyTest被public修饰了,故Class A不能用public修饰

    class A{}

    //由于MyTest被public修饰了,故Class B不能用public修饰

    class B{}

    1、java源文件名就是该源文件中public类的名称

    6a18b379e655c30e9b24652731a27d06.png

    2、一个java源文件可以包含多个类,但只允许一个类为public

    二、编译java源代码

    当java源程序编码结束后,就需要编译器编译。

    安装好jdk后,我们打开jdk目录,有两个.exe文件,即javac.exe(编译源代码,xxx.java文件) 和 java.exe(执行字节码,xxx.class文件).

    如下图所示:

    70a2dfc7337792863879a77e79e53f4e.png

    1、切换到MyTest.java文件夹

    dc75a3d5a0a46b07a8a4f8e66c19d950.png

    2、javac.exe编译MyTest.java

    e0a797e1040fd73c3bafa1812c805390.png

    编译后,发现e:Blogs 目录多了以class为后缀的文件:A.class,B.class和MyTest.class

    738faa83322a68b9524e87b214c7262c.png

    Tip:当javac.exe编译java源代码时,java源代码有几个类,就会编译成一个对应的字节码文件(.class文件)

    其中,字节码文件的文件名就是每个类的类名。需要注意的是,类即使不在源文件中定义,但被源文件引用,编译后,也会编程相应的字节码文件。

    如类A引用类C,但类C不定义在类A的源文件中,编译后,类C也被编译成对应的字节码文件C.class

    Tips:关注微信公众号:Java后端,每日获取技术博文推送。

    三、执行java源文件

    执行java源文件,用java.exe执行即可

    4d20b04f39a0696922be49516df56a4a.png

    到现在,java源程序基本执行结果,并正确打印我们期望的结果,那么,如上的步骤,我们可以总结如下:

    67c0c4f181cd85ef25b1f8b610924486.png

    如上总结,已经抽象化了在JVM中的执行。接下来,我们将分析字节码文件(.class文件)如何在虚拟机中一步一执行的。

    四、JVM如何执行字节码文件

    1、装载字节码文件

    当 .java 源码被 javac.exe 编译器编译成 .class 字节码文件后,接下来的工作就交给JVM处理。

    JVM首先通过类加载器(ClassLoader),将class文件和相关Java API加载装入JVM,以供JVM后续处理。

    在该阶段中,涉及到如下一些基本概念和知识。

    1)JDK,JRE和JVM关系

    • JDK(Java Development Kit),Java开发工具包,主要用于开发,在JDK7前,JDK包括JRE
    • JRE(Java Runtime Environment),Java程序运行的核心环境,包括JVM和一些核心库
    • JVM(Java Virtual Machine),VM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,是JRE核心模块。

    2)JVM

    JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

    Java虚拟机的主要任务是装载class文件,并执行其中的字节码,不同的Java虚拟机中,执行引擎可能有不同的实现。

    大致有如下几种引擎:

    • 一次性解释字节码引擎
    • 即时编译引擎
    • 自适应优化器

    关于虚拟机的实现方式,采用软件方式、硬件方式和软件硬件结合方式,这个要根据具体厂商而定。

    3)什么是ClassLoader

    虚拟机的主要任务是装载class文件并执行其中的字节码,而class文件是由虚拟机的类加载器(ClassLoader)完成的,在一个Java虚拟机中有可能存在多个类加载器。

    任何java运用程序,可能会使用两种类加载器,即启动类加载器(bootstrap)和用户自定义类加载器。

    启动类加载器是Java虚拟机唯一实现的一部分,它又可分为原始类装载器,系统类装载器或默认类装载器。它的主要作用是从操作系统的磁盘装载相应的类,如Java API类等。

    用户自定义装载类,即按照用户自定义的方式来装载类。

    2518695e7debf90ab85a32ce28583eca.png

    2、将字节码文件存储在JVM内存区

    当JAVA虚拟机运行一个程序时,它需要内存来存储许多东西。

    比如如字节码,程序创建的对象,传递给方法的参数,返回值,局部变量以及运算的中间结果等,这些相关信息被组织到“运行时数据区”。

    根据厂商的不同,在Java虚拟机中,运行时数据区也有所不同。有些运行时数据区由线程共享,有些只能由某个特定线程共享。

    运行时数据区大致可分几个区:方法区,堆区,栈区,PC寄存器区和本地方法栈区。

    在该阶段中,涉及到如下基本概念和知识。

    1)方法区

    方法区用来存储解析被加载的class文件的相关信息。

    当虚拟装载一个class文件后,它会从这个class文件包含的二进制数据中解析类型信息,然后将该相关信息存储到方法区中。

    2)堆

    堆是用来存储相关引用类型的,如new对象。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。

    3)PC寄存器

    PC寄存器主要用来存储线程。当新创建一个线程时,该线程都将得到一个自己的PC寄存器(程序计数器)以及一个java栈。

    Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。

    4)栈区

    栈区主要用来存储值类型的,如基本数据类型。需要注意的是,String为引用类型,是存在堆中的。

    Java栈是由许多栈帧组成的,一个栈帧包含一个Java方法调用的状态,当线程调用一个方法时,虚拟机压入一个新的栈帧到该线程的Java栈中,当该方法返回时,这个栈帧从Java栈中弹出。

    bf0fdb61dd510d222ddaf9e44cee96bb.png

    3、执行引擎与运行时数据区交互

    运行时数据区为执行引擎提供了执行环境和相关数据,执行引擎通过与运行时数据区交互,从而获取执行时需要的相关信息,存储执行的中间结果等

    b0f34b1d2f34cd920edbdca524104392.png

    4、执行引擎与本地方法接口

    当要执行本地方法时,执行引擎将调用本地方法接口来获取相关OS本地方法。

    需要注意的是,本地方法与操作系统强耦合的。

    8eca121b6ca80327899de8a4050d043c.png

    5、JVM在具体操作系统上执行

    JVM通过调用本地接口来获取本地方法,从而实现在具体的平台上执行。比如在Linux系统上执行,在Window系统上执行和在Unix系统上执行。

    62b47a2a17503bd132c88840e366a184.png
    展开全文
  • 对于任何一门语言,想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历...

    对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。

    在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历了什么?每一步又是怎么执行的?执行原理又是什么?

    一、编写java源程序

    java源文件:指存储java源码的文件。

    先来看看如下代码:

    //MyTest被public修饰,故存储该java源码的文件名为MyTest

    public class MyTest {

    public static void main(String[] args){

    System.out.println("Test Java execute process.");

    }

    }

    //由于MyTest被public修饰了,故Class A不能用public修饰

    class A{}

    //由于MyTest被public修饰了,故Class B不能用public修饰

    class B{}

    1、java源文件名就是该源文件中public类的名称

    2、一个java源文件可以包含多个类,但只允许一个类为public

    二、编译java源代码

    当java源程序编码结束后,就需要编译器编译。

    安装好jdk后,我们打开jdk目录,有两个.exe文件,即javac.exe(编译源代码,xxx.java文件) 和 java.exe(执行字节码,xxx.class文件).

    如下图所示:

    1、切换到MyTest.java文件夹

    2、javac.exe编译MyTest.java

    编译后,发现e:\Blogs 目录多了以class为后缀的文件:A.class,B.class和MyTest.class

    Tip:当javac.exe编译java源代码时,java源代码有几个类,就会编译成一个对应的字节码文件(.class文件)

    其中,字节码文件的文件名就是每个类的类名。需要注意的是,类即使不在源文件中定义,但被源文件引用,编译后,也会编程相应的字节码文件。

    如类A引用类C,但类C不定义在类A的源文件中,编译后,类C也被编译成对应的字节码文件C.class

    Tips:关注微信公众号:Java后端,每日获取技术博文推送。

    三、执行java源文件

    执行java源文件,用java.exe执行即可

    到现在,java源程序基本执行结果,并正确打印我们期望的结果,那么,如上的步骤,我们可以总结如下:

    如上总结,已经抽象化了在JVM中的执行。接下来,我们将分析字节码文件(.class文件)如何在虚拟机中一步一执行的。

    四、JVM如何执行字节码文件

    1、装载字节码文件

    当 .java 源码被 javac.exe 编译器编译成 .class 字节码文件后,接下来的工作就交给JVM处理。

    JVM首先通过类加载器(ClassLoader),将class文件和相关Java API加载装入JVM,以供JVM后续处理。

    在该阶段中,涉及到如下一些基本概念和知识。

    1)JDK,JRE和JVM关系JDK(Java Development Kit),Java开发工具包,主要用于开发,在JDK7前,JDK包括JRE

    JRE(Java Runtime Environment),Java程序运行的核心环境,包括JVM和一些核心库

    JVM(Java Virtual Machine),VM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,是JRE核心模块。

    2)JVM

    JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

    Java虚拟机的主要任务是装载class文件,并执行其中的字节码,不同的Java虚拟机中,执行引擎可能有不同的实现。

    大致有如下几种引擎:一次性解释字节码引擎

    即时编译引擎

    自适应优化器

    关于虚拟机的实现方式,采用软件方式、硬件方式和软件硬件结合方式,这个要根据具体厂商而定。

    3)什么是ClassLoader

    虚拟机的主要任务是装载class文件并执行其中的字节码,而class文件是由虚拟机的类加载器(ClassLoader)完成的,在一个Java虚拟机中有可能存在多个类加载器。

    任何java运用程序,可能会使用两种类加载器,即启动类加载器(bootstrap)和用户自定义类加载器。

    启动类加载器是Java虚拟机唯一实现的一部分,它又可分为原始类装载器,系统类装载器或默认类装载器。它的主要作用是从操作系统的磁盘装载相应的类,如Java API类等。

    用户自定义装载类,即按照用户自定义的方式来装载类。

    2、将字节码文件存储在JVM内存区

    当JAVA虚拟机运行一个程序时,它需要内存来存储许多东西。

    比如如字节码,程序创建的对象,传递给方法的参数,返回值,局部变量以及运算的中间结果等,这些相关信息被组织到“运行时数据区”。

    根据厂商的不同,在Java虚拟机中,运行时数据区也有所不同。有些运行时数据区由线程共享,有些只能由某个特定线程共享。

    运行时数据区大致可分几个区:方法区,堆区,栈区,PC寄存器区和本地方法栈区。

    在该阶段中,涉及到如下基本概念和知识。

    1)方法区

    方法区用来存储解析被加载的class文件的相关信息。

    当虚拟装载一个class文件后,它会从这个class文件包含的二进制数据中解析类型信息,然后将该相关信息存储到方法区中。

    2)堆

    堆是用来存储相关引用类型的,如new对象。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。

    3)PC寄存器

    PC寄存器主要用来存储线程。当新创建一个线程时,该线程都将得到一个自己的PC寄存器(程序计数器)以及一个java栈。

    Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。

    4)栈区

    栈区主要用来存储值类型的,如基本数据类型。需要注意的是,String为引用类型,是存在堆中的。

    Java栈是由许多栈帧组成的,一个栈帧包含一个Java方法调用的状态,当线程调用一个方法时,虚拟机压入一个新的栈帧到该线程的Java栈中,当该方法返回时,这个栈帧从Java栈中弹出。

    3、执行引擎与运行时数据区交互

    运行时数据区为执行引擎提供了执行环境和相关数据,执行引擎通过与运行时数据区交互,从而获取执行时需要的相关信息,存储执行的中间结果等

    4、执行引擎与本地方法接口

    当要执行本地方法时,执行引擎将调用本地方法接口来获取相关OS本地方法。

    需要注意的是,本地方法与操作系统强耦合的。

    5、JVM在具体操作系统上执行

    JVM通过调用本地接口来获取本地方法,从而实现在具体的平台上执行。比如在Linux系统上执行,在Window系统上执行和在Unix系统上执行。

    码字不容易,帮忙点个赞,点赞关注是我写作的动力,谢谢!

    展开全文
  • 于任何一门语言,想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。 在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历...

    于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。
    在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历了什么?每一步又是怎么执行的?执行原理又是什么?

    一、编写java源程序
    java源文件:指存储java源码的文件。
    先来看看如下代码:
    //MyTest被public修饰,故存储该java源码的文件名为MyTest
    public class MyTest {
    public static void main(String[] args){
    System.out.println(“Test Java execute process.”);
    }
    }
    //由于MyTest被public修饰了,故Class A不能用public修饰
    class A{}
    //由于MyTest被public修饰了,故Class B不能用public修饰
    class B{}
    1、java源文件名就是该源文件中public类的名称

    2、一个java源文件可以包含多个类,但只允许一个类为public
    二、编译java源代码
    当java源程序编码结束后,就需要编译器编译。
    安装好jdk后,我们打开jdk目录,有两个.exe文件,即javac.exe(编译源代码,xxx.java文件) 和 java.exe(执行字节码,xxx.class文件).
    如下图所示:

    1、切换到MyTest.java文件夹

    2、javac.exe编译MyTest.java

    编译后,发现e:\Blogs 目录多了以class为后缀的文件:A.class,B.class和MyTest.class

    Tip:当javac.exe编译java源代码时,java源代码有几个类,就会编译成一个对应的字节码文件(.class文件)
    其中,字节码文件的文件名就是每个类的类名。需要注意的是,类即使不在源文件中定义,但被源文件引用,编译后,也会编程相应的字节码文件。
    如类A引用类C,但类C不定义在类A的源文件中,编译后,类C也被编译成对应的字节码文件C.class
    Tips:关注微信公众号:Java后端,每日获取技术博文推送。
    三、执行java源文件
    执行java源文件,用java.exe执行即可

    到现在,java源程序基本执行结果,并正确打印我们期望的结果,那么,如上的步骤,我们可以总结如下:

    如上总结,已经抽象化了在JVM中的执行。接下来,我们将分析字节码文件(.class文件)如何在虚拟机中一步一执行的。
    四、JVM如何执行字节码文件
    1、装载字节码文件
    当 .java 源码被 javac.exe 编译器编译成 .class 字节码文件后,接下来的工作就交给JVM处理。
    JVM首先通过类加载器(ClassLoader),将class文件和相关Java API加载装入JVM,以供JVM后续处理。
    在该阶段中,涉及到如下一些基本概念和知识。
    1)JDK,JRE和JVM关系
    JDK(Java Development Kit),Java开发工具包,主要用于开发,在JDK7前,JDK包括JRE
    JRE(Java Runtime Environment),Java程序运行的核心环境,包括JVM和一些核心库
    JVM(Java Virtual Machine),VM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,是JRE核心模块。
    2)JVM
    JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
    Java虚拟机的主要任务是装载class文件,并执行其中的字节码,不同的Java虚拟机中,执行引擎可能有不同的实现。
    大致有如下几种引擎:
    一次性解释字节码引擎
    即时编译引擎
    自适应优化器
    关于虚拟机的实现方式,采用软件方式、硬件方式和软件硬件结合方式,这个要根据具体厂商而定。
    3)什么是ClassLoader
    虚拟机的主要任务是装载class文件并执行其中的字节码,而class文件是由虚拟机的类加载器(ClassLoader)完成的,在一个Java虚拟机中有可能存在多个类加载器。
    任何java运用程序,可能会使用两种类加载器,即启动类加载器(bootstrap)和用户自定义类加载器。
    启动类加载器是Java虚拟机唯一实现的一部分,它又可分为原始类装载器,系统类装载器或默认类装载器。它的主要作用是从操作系统的磁盘装载相应的类,如Java API类等。
    用户自定义装载类,即按照用户自定义的方式来装载类。

    2、将字节码文件存储在JVM内存区
    当JAVA虚拟机运行一个程序时,它需要内存来存储许多东西。
    比如如字节码,程序创建的对象,传递给方法的参数,返回值,局部变量以及运算的中间结果等,这些相关信息被组织到“运行时数据区”。
    根据厂商的不同,在Java虚拟机中,运行时数据区也有所不同。有些运行时数据区由线程共享,有些只能由某个特定线程共享。
    运行时数据区大致可分几个区:方法区,堆区,栈区,PC寄存器区和本地方法栈区。
    在该阶段中,涉及到如下基本概念和知识。
    1)方法区
    方法区用来存储解析被加载的class文件的相关信息。
    当虚拟装载一个class文件后,它会从这个class文件包含的二进制数据中解析类型信息,然后将该相关信息存储到方法区中。
    2)堆
    堆是用来存储相关引用类型的,如new对象。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。
    3)PC寄存器
    PC寄存器主要用来存储线程。当新创建一个线程时,该线程都将得到一个自己的PC寄存器(程序计数器)以及一个java栈。
    Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。
    4)栈区
    栈区主要用来存储值类型的,如基本数据类型。需要注意的是,String为引用类型,是存在堆中的。
    Java栈是由许多栈帧组成的,一个栈帧包含一个Java方法调用的状态,当线程调用一个方法时,虚拟机压入一个新的栈帧到该线程的Java栈中,当该方法返回时,这个栈帧从Java栈中弹出。

    3、执行引擎与运行时数据区交互
    运行时数据区为执行引擎提供了执行环境和相关数据,执行引擎通过与运行时数据区交互,从而获取执行时需要的相关信息,存储执行的中间结果等

    4、执行引擎与本地方法接口
    当要执行本地方法时,执行引擎将调用本地方法接口来获取相关OS本地方法。
    需要注意的是,本地方法与操作系统强耦合的。

    5、JVM在具体操作系统上执行
    JVM通过调用本地接口来获取本地方法,从而实现在具体的平台上执行。比如在Linux系统上执行,在Window系统上执行和在Unix系统上执行。

    有没有想学java却无从下手的+裙768976403一起来学习吧!
    别忘了咨询管理员获取学习资料哦

    展开全文
  • 对于任何一门语言,想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历...

    对于任何一门语言,要想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。

    在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历了什么?每一步又是怎么执行的?执行原理又是什么?

    3f563f778fe6f252eeb7f2afd83af8dd.png

    一、编写java源程序

    java源文件:指存储java源码的文件。

    先来看看如下代码:

    //MyTest被public修饰,故存储该java源码的文件名为MyTestpublic class MyTest {    public static void main(String[] args){        System.out.println("Test Java execute process.");    }}//由于MyTest被public修饰了,故Class A不能用public修饰class A{}//由于MyTest被public修饰了,故Class B不能用public修饰class B{}

    1、java源文件名就是该源文件中public类的名称

    9253df79a83183da0297a5ae55363125.png

    2、一个java源文件可以包含多个类,但只允许一个类为public

    二、编译java源代码

    当java源程序编码结束后,就需要编译器编译。

    安装好jdk后,我们打开jdk目录,有两个.exe文件,即javac.exe(编译源代码,xxx.java文件) 和 java.exe(执行字节码,xxx.class文件).

    如下图所示:

    1ff3e0a508f12f50f01a9fb41a20d897.png

    1、切换到MyTest.java文件夹

    c8c11c42f97146230fc69d49b9e42d3a.png

    2、javac.exe编译MyTest.java

    4694b2a4ce2be9a4ef908be2104e32fb.png

    编译后,发现e:Blogs 目录多了以class为后缀的文件:A.class,B.class和MyTest.class

    d3c558f23dd296533e783323b7bc6f1d.png

    Tip:当javac.exe编译java源代码时,java源代码有几个类,就会编译成一个对应的字节码文件(.class文件)

    其中,字节码文件的文件名就是每个类的类名。需要注意的是,类即使不在源文件中定义,但被源文件引用,编译后,也会编程相应的字节码文件。

    如类A引用类C,但类C不定义在类A的源文件中,编译后,类C也被编译成对应的字节码文件C.class

    Tips:关注微信公众号:Java后端,每日获取技术博文推送。

    三、执行java源文件

    执行java源文件,用java.exe执行即可

    b77758702868488b9e2c1affa0b483fd.png

    到现在,java源程序基本执行结果,并正确打印我们期望的结果,那么,如上的步骤,我们可以总结如下:

    1dd1667de1da8e4e9d70f3ef23bea21f.png

    如上总结,已经抽象化了在JVM中的执行。接下来,我们将分析字节码文件(.class文件)如何在虚拟机中一步一执行的。

    四、JVM如何执行字节码文件

    1、装载字节码文件

    当 .java 源码被 javac.exe 编译器编译成 .class 字节码文件后,接下来的工作就交给JVM处理。

    JVM首先通过类加载器(ClassLoader),将class文件和相关Java API加载装入JVM,以供JVM后续处理。

    在该阶段中,涉及到如下一些基本概念和知识。

    1)JDK,JRE和JVM关系

    JDK(Java Development Kit),Java开发工具包,主要用于开发,在JDK7前,JDK包括JRE

    JRE(Java Runtime Environment),Java程序运行的核心环境,包括JVM和一些核心库

    JVM(Java Virtual Machine),VM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的,是JRE核心模块。

    2)JVM

    JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

    Java虚拟机的主要任务是装载class文件,并执行其中的字节码,不同的Java虚拟机中,执行引擎可能有不同的实现。

    大致有如下几种引擎:

    • 一次性解释字节码引擎
    • 即时编译引擎
    • 自适应优化器

    关于虚拟机的实现方式,采用软件方式、硬件方式和软件硬件结合方式,这个要根据具体厂商而定。

    3)什么是ClassLoader

    虚拟机的主要任务是装载class文件并执行其中的字节码,而class文件是由虚拟机的类加载器(ClassLoader)完成的,在一个Java虚拟机中有可能存在多个类加载器。

    任何java运用程序,可能会使用两种类加载器,即启动类加载器(bootstrap)和用户自定义类加载器。

    启动类加载器是Java虚拟机唯一实现的一部分,它又可分为原始类装载器,系统类装载器或默认类装载器。它的主要作用是从操作系统的磁盘装载相应的类,如Java API类等。

    用户自定义装载类,即按照用户自定义的方式来装载类。

    6a2b4ff6ad5c80a5016b4834522530ae.png

    2、将字节码文件存储在JVM内存区

    当JAVA虚拟机运行一个程序时,它需要内存来存储许多东西。

    比如如字节码,程序创建的对象,传递给方法的参数,返回值,局部变量以及运算的中间结果等,这些相关信息被组织到“运行时数据区”。

    根据厂商的不同,在Java虚拟机中,运行时数据区也有所不同。有些运行时数据区由线程共享,有些只能由某个特定线程共享。

    运行时数据区大致可分几个区:方法区,堆区,栈区,PC寄存器区和本地方法栈区。

    在该阶段中,涉及到如下基本概念和知识。

    1)方法区

    方法区用来存储解析被加载的class文件的相关信息。

    当虚拟装载一个class文件后,它会从这个class文件包含的二进制数据中解析类型信息,然后将该相关信息存储到方法区中。

    2)堆

    堆是用来存储相关引用类型的,如new对象。当程序运行时,虚拟机会把所有该程序在运行时创建的对象都放到堆中。

    3)PC寄存器

    PC寄存器主要用来存储线程。当新创建一个线程时,该线程都将得到一个自己的PC寄存器(程序计数器)以及一个java栈。

    Java虚拟机没有寄存器,其指令集使用Java栈来存储中间数据。

    4)栈区

    栈区主要用来存储值类型的,如基本数据类型。需要注意的是,String为引用类型,是存在堆中的。

    Java栈是由许多栈帧组成的,一个栈帧包含一个Java方法调用的状态,当线程调用一个方法时,虚拟机压入一个新的栈帧到该线程的Java栈中,当该方法返回时,这个栈帧从Java栈中弹出。

    f20f8dad895ff00a0ff22c4902dd9b45.png

    3、执行引擎与运行时数据区交互

    运行时数据区为执行引擎提供了执行环境和相关数据,执行引擎通过与运行时数据区交互,从而获取执行时需要的相关信息,存储执行的中间结果等

    9379004cefc01075a8f65a3a3b78e73e.png

    4、执行引擎与本地方法接口

    当要执行本地方法时,执行引擎将调用本地方法接口来获取相关OS本地方法。

    需要注意的是,本地方法与操作系统强耦合的。

    792a7cabf7a87810f5e9212a95c085ee.png

    5、JVM在具体操作系统上执行

    JVM通过调用本地接口来获取本地方法,从而实现在具体的平台上执行。比如在Linux系统上执行,在Window系统上执行和在Unix系统上执行。

    6b9d86b3caf761eb6448a76f0e107406.png

    作者:Java微服务
    链接:https://www.jianshu.com/p/c9047fea16a3
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    展开全文
  • 对于任何一门语言,想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历...
  • 对于任何一门语言,想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。 在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都...
  • 这里包含几本书 介绍了JAVA的安装 还有好的代码 有基础教程 内容挺丰富的 下载看看就知道 很经典的
  • 对于任何一门语言,想达到精通的水平,研究它的执行原理(或者叫底层机制)不失为一种良好的方式。在本篇文章中,将重点研究java源代码的执行原理,即从程序员编写JAVA源代码,到最终形成产品,在整个过程中,都经历...
  • 要精通java必看的经典书籍:Ajax中文手册(快速上手),hibernat培训,JavaScript源码大全 v1.0,Struts快速学习指南,全新java基础实践教程,Spring+in+Action中文版
  • 今天早上有幸拜读了左潇龙大大的博文:万能的林萧说:一篇文章教会你,如何做到招聘要求中的“有扎实的Java基础”。,又为我的学习进一步指明了方向。最近学习的东西实在是不少,不过我还是决定挤出时间来把Java...
  • 我现在是一个大三的计算机专业的学生。大一的时候也没好好学,大二下学期才开始认真。刚过去的一个暑假学了挺多东西,现在感觉C,C#网络编程,C++,...我现在更倾向于去精通JAVA.请问有什么建议呢。看点什么书之类的。
  • 请问,学好android所需要的基础中,很多人和很多公司招人都说要精通java,请问怎么才算是精通java呢? 我觉得这个所谓的精通java是从android的方向去考虑吧,譬如java图形界面用户界面的开发就不需要,因为在安卓上...
  • 对于一个程序员来说,精通JAVA...想要精通JAVA技术除了我们的基本态度要正确,要有恒心和毅力去学习外,还要知道应该掌握哪些内容,这样才能够事半功倍。那么怎么才能精通JAVA技术呢?想要精通JAVA技术应该掌握哪...
  • 如何精通JAVA

    2013-11-26 17:26:22
    对于一个程序员来说,精通JAVA可以说是他们的最高境界了。...想要精通JAVA技术除了我们的基本态度要正确,要有恒心和毅力去学习外,还要知道应该掌握哪些内容,这样才能够事半功倍。那么怎么才能精通JAVA技术呢?想要精
  • 转]精通java,以下为必要条件:1、当然对java语法和语义有相当的理解及纯熟的应用,比方说对继承体系中的对象的比较复杂初始化顺序的清晰把握,对内部类和无名内部类的理解和使用时机的把握,对反射和序列化机制的...
  • 精通java必须看的经典书籍精通java必须看的经典书籍精通java必须看的经典书籍精通java必须看的经典书籍精通java必须看的经典书籍精通java必须看的经典书籍精通java必须看的经典书籍
  • 简历和自我介绍上经常能够读到“精通Java”这样的话,有人和我说,精通Java的人太多了,精通Java已经不能算亮点、不能给自己加分了。可是事实真是这样吗?对于语言的学习,我有一种观点,一是纵向,即选择一门自己...
  • 精通java技术应该掌握哪些知识

    千次阅读 2018-05-04 10:26:58
    要精通JAVA技术除了我们的基本态度要正确,要有恒心和毅力去学习外,还要知道应该掌握哪些内容,这样才能够事半功倍。那么想要精通JAVA技术应该掌握哪些知识呢? 工具 必须至少熟练使用一种IDE的开发工具,例如...
  • 精通java必须看的经典书籍(强顶)

    千次下载 热门讨论 2008-08-04 14:45:07
    包括:Ajax快速上手,hibernat培训讲义,JavaScript源码大全,Spring+in+Action中文,Struts快速学习指南,全新java基础实践教程,都是非常经典的资料,另外还可以充当工具书,遇到不会的可以查哦
  • 简历和自我介绍上经常能够读到“精通Java”这样的话,有人和我说,精通Java的人太多了,精通Java已经不能算亮点、不能给自己加分了。可是事实真是这样吗?对于语言的学习,我有一种观点,一是纵向,即选择一门自己...
  • 精通java,以下为必要条件:1、当然对java语法和语义有相当的理解及纯熟的应用,比方说对继承体系中的对象的比较复杂初始化顺序的清晰把握,对内部类和无名内部类的理解和使用时机的把握,对反射和序列化机制的...
  • 从中你能了解精通JAVA的必要条件以及知识点
  • 简历和自我介绍上经常能够读到“ 精通 Java” 这样的话,有人和我说,精通 Java 的人太多了,精通 Java 已经不能算亮点、不能给自己加分了。可是事实真是这样吗?对于语言的学习,我有一种观点,一是纵向,即选择...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,712
精华内容 1,084
关键字:

要精通java

java 订阅