一、java程序的运行过程
1.一个java程序通过javac编译成.class文件。
2.jvm会把.class文件加载到方法区。
3.执行引擎会执行这些字节码。(翻译成操作系统相关的函数)
二、JVM\JDK\JRE之间的关系。
JVM:把.class字节码翻译成机器识别的代码,jvm不能生成代码,所以需要JRE提供各种类库。 JRE:JAVA运行时环境(Java Runtime Environment),包括jvm + 基础类库(读写操作、网络连接、I/O操作) JDK:包括JAVM和jre。同时还有很多的其它工具。编译代码的javac,反编译代码的javap打包等工具。
三、jvm是一种规范
1.jvm的跨平台性
jvm跨平台性:在不同操作系统下使用的是不同平台的JVM,而不是说在不同平台用同一个jvm
2.jvm语言无关性。
JVM可以说是跨语言的平台,不同的语言只要编译成字节码,是基于字节码规范的,那么就可以在jvm上执行。
四、运行时数据区
定义:java虚拟机在执行java程序的时候会把它所管理的内存,划分成若干的不同区域。(也叫规范化) 划分的方式按照线程的私有和共享进行划分。
- jdk1.7及以前叫永久代。之后的叫原空间。
- 永久代和原空间是方法区的一种实现。
- 线程共享的是:方法区和堆。
- 线程私有的是:虚拟机栈、本地方法栈、程序计数器
- 直接内存都是通过unsafe类去申请的,它已经跨越了虚拟机的规范。
五、虚拟机栈
1.程序每调用一个方法都会进行压栈操作,虚拟机栈里存储的都是每个方法的栈帧数据。当方法执行完后会出栈。
2.栈的大小默认值取决于平台。
1)64位的操作系统栈的默认大小往往是1024KB
2)通过-Xss 可以设置栈的大小。后面直接加大小(不需要空格,单位是小写,没加单位默认是比特)
3.虚拟机栈的组成
1) 程序计数器:指向当前程序正在执行的字节码指令的地址。不会记录本地方法栈里的地址。
2)虚拟机栈:局部变量表、操作数栈、动态链接、返回地址等。
4.部分字节码指令
1)iconset_1:这种方法能获取到的值是-1,0,1,2,3,4,5.其它的值只能用push的指令获取。(把对应的数据压入操作数栈)
六、JVM
1.adb命令查看程序的设置。
1)jps:查找当前运行应用的ID号。
2)jinfo -flags id .查看id应用对应的默认设置。command line:自己设置的内容。
2.实例代码的运行,JVM内存处理的流程。
1)JVM 向操作系统申请内存:
2)JVM 获得内存空间后,会根据配置参数分配堆、栈以及方法区的内存大小
3)类加载
4)执行方法及创建对象