一个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执行过程:
- 类装载器(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