JVM 技术分享(初级)

一个java程序是怎样运行起来的:

 

public class Test {
	
	public static void main(String[] args){
		System.out.println("test");
	}
    
}

1.编辑一个Test.java文件 --> javac Test.java 会生成一个Test.class文件-->java Test -->控制台显示程序。

  Javac:Javac是一种编译器,将一种语言转换为另一种语言规范。编译器的作用就是将符合java语言规范的源代码转化为JVM虚拟机能够识别的字节码文件的过程。即将符合java语言规范的源码转换为JVM可识别的二进制码(原.java文件仍然保留)。

  Javap,Javac,Javah     :  https://blog.csdn.net/nigelyq/article/details/46379473

  

 

javac的实现过程:https://www.cnblogs.com/shuai-server/p/8998021.html

java运行过程:https://blog.csdn.net/chengzhang1989/article/details/70216634

javac的编译过程:https://blog.csdn.net/u013256816/article/details/50804493  (参考了深入JVM虚拟机等书籍)

Java类到底如何加载并初始化的:https://www.cnblogs.com/jimxz/p/3974939.html

Java内存模型:http://www.importnew.com/28456.html

Java内存机制(浅析):http://www.cnblogs.com/KingIceMou/p/6967129.html

2.什么是JVM:

java编译器只要面向JVM,生成JVM能理解的代码或字节码文件。Java源文件经编译成字节码程序,通过JVM将每一条指令翻译成不同平台机器码,通过特定平台运行。

 

JVM即Java Virtual Machine,是一种计算设备的规范,是虚拟粗来的计算机,是在实际计算机上仿真模拟各计算机功能实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域,其屏蔽了具体操作系统相关信息,在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

1)JDK(Java Development Kit)是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件。

2)JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。

3)JVM(JavaVirtualMachine,Java虚拟机)是JRE的一部分。它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM有自己完善的硬件架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。Java语言最重要的特点就是跨平台运行。使用JVM就是为了支持与操作系统无关,实现跨平台。

3.JVM执行过程:

1) 加载.class文件 2) 管理并分配内存 3) 执行垃圾收集
JRE(java运行时环境)由JVM构造的java程序的运行环,也是Java程序运行的环境,但是他同时一个操作系统的一个应用程序一个进程,因此他也有他自己的运行的生命周期,也有自己的代码和数据空间。JVM在整个jdk中处于最底层,负责于操作系统的交互,用来屏蔽操作系统环境,提供一个完整的Java运行环境,因此也就虚拟计算机。操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境:1) 创建JVM装载环境和配置 2) 装载JVM.dll 3) 初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例4) 调用JNIEnv实例装载并处理class类。
 
4.JVM体系结构:

 

  • 类装载器(ClassLoader)(用来装载.class文件)
  • 执行引擎(执行字节码,或者执行本地方法)
  • 运行时数据区(方法区、堆、java栈、PC寄存器、本地方法栈

 自此引出类加载机制: http://www.importnew.com/25295.html

 类加载器及JVM内存结构:http://www.cnblogs.com/KingIceMou/p/6967713.html

 Java动态代理:https://www.cnblogs.com/gonjan-blog/p/6685611.html 

 

 

 

 

 

 

 

 

 

 

posted @ 2018-07-16 14:14  不会就问咯  阅读(585)  评论(0编辑  收藏  举报