内存模型图:
我们的java文件是怎样执行的:
Java文件通过调用javac命令编译---->生成.class文件,然后调用java命令去运行.class文件在JVMjava虚拟机上,执行引擎将java的字节码指令转化成C++代码进行汇编。
汇编语言主要有两种intel汇编和AT&T汇编,。
JVM跨平台的本质:汇编指令的不同。
为什么多种语言可以在JVM上运行:
因为各种语言的源文件都是通过编译器进行编译成class字节码文件,然后再通过类加载器子系统进行加载、连接、初始化等等。不同语言的编译器能够将不同语言的语法翻译成同样的字节码文件,这就是其重要原因。
为什么选择JVM:
优秀的内存管理,内存模型;
精简的字节码指令+高效的执行引擎;
安全可扩展的类加载器子系统;
高性能+低延迟的垃圾回收器。
JVM的组成:
运行时数据区、类加载器子系统、执行引擎。
类加载器子系统中的四个基本概念:
(1)class文件:是由javac名利那个编译成的class文件,存放在磁盘上的。
(2)class content:由类加载器将class文件加载到内存里面的那一块内存,是一块区域,是直接放在内存上的,因为程序一定是在内存上执行的而不是在硬盘上,所以要将class文件加载到内存中去,
以上两个概念内容上没有任何区别,只是存放的位置不同。
(3)class对象:是存放在方法区的。类加载器子系统基于JVM虚拟机规范将class content解析成class对象
(4)对象:它是被new出来的,放在堆内存中。执行引擎在执行new语句时会拿到class对象并生成对象放入堆内存中。
什么是方法区:虚拟机规范,
永久代和元空间是方法区的具体实现。
JDK1.8以后为什么要用永久代取代元空间:
(1)硬件的发展
(2)业务的发展–系统复杂度的提升。
什么是虚拟机栈:
JVM中分为主内存(机器内存)和工作内存(虚拟机栈,默认大小是1M)
,没一个线程都有一个虚拟机栈,虚拟机栈式随着方法的调用而创建的,每个虚拟机栈里面又有多个栈帧。
每个栈帧包括:
(1)局部变量表:存放局部变量的。单位是slot插槽,默认是两个,在编译的时候就已经存在了。
(2)操作数栈:等号右边的叫操作数,它会被编译成一些指令字符
(3)动态连接:main方法的内存地址,每个类的方法都是存在于类对象集合里面的
返回地址,还有一个附加信息。
程序计数器:方法的字节码的字节号
参考博文:
https://blog.youkuaiyun.com/bruce128/article/details/79357870