Java编程究竟什么是Jvm为什么有Jv
首先,我们要先温习一下jvm的概念。究竟什么是jvm,为什么有jvm?
Jvm是Java虚拟机(Java virtual machine)它实现了“一次编译,处处运行”的功能。如果没有jvm的话,我们编写的Java代码,如果想要在window上运行,那就需要编写一套适用于window平台的编码。当然如果想在linux中运行就要编写一套linux能够识别的编码语言。
JVM内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。
类的加载(加载到jvm)
class文件通过类加载器加载到内存
类加载器使用的加载模式:双亲委托机制
当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委托给父类加载器ExtClassLoader去完成。
当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委托给bootStrapClassLoader去完成。
如果BootStrapClassLoader加载失败,会使用ExtClassLoader来尝试加载。
若ExtClassLoader也加载失败,则会使用AppClassLoader来加载。
如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException。
类加载器:
BootStrapClassLoader 启动类加载器 负责jre/lib/rt.jar
ExtClassLoader 扩展类加载器 jre/lib/*.jar或-Djava.ext.dirs
AppClassLoader 应用类加载器 记载classpath中指定的jar包及目录中class
UserClassLoader 自定义的类加载器 继承ClassLoader getClass.ClassLoader可以获得
在类加载检查通过后,接下来虚拟机将为新生对象分配内存。
简单看了一下内存模型,简单看看每隔区域酒精存储的是是什么(干的是什么)
堆:存放对象实例,几乎所有的对象实例都在这里分配内存
本地方法栈:本地方法栈则是为虚拟机使用到的native方法服务。
方法区:存储已经被虚拟机加载的类元数据信息(元空间)
我来宏观的讲解一下工作流程:
1.通过Java.exe运行JavaTest.class,随后被加载到jvm中,方法区(元空间)存储着类的信息(包括类的名称、方法的信息、字段信息)
2.jvm找到JavaTest的主函数入口(main)为main函数创建栈帧,开始执行main函数
3.main函数的第一条命令是javaTest jt=new JavaTest;就是让jvm创建一个javaTest对象,但是这时候方法区中没有JavaTest类的信息,所以jvm马上加载JavaTest类,把javaTest类的类型信息放到方法区中(元空间)
4.加载完javaTest类之后,Java虚拟机做的第一件事情就是在堆区中为一个新的JavaTest实例分配内存,调用构造函数初始化javaTest实例,这个JavaTest实例持有着指向方法区的JavaTest类的类型信息(其中包含方法表,Java动态绑定的底层实现)的引用。
为setName函数创建栈帧,开始运行setName函数。
本文相关词条概念解析:
加载
加载,计算机术语,是把硬盘上的有用程序调到内存中的整个过程。现用于电脑及计算机控制设备方面较普遍,如:硬盘上的有用程序调到内存中的整个过程,一般来说我们在启动程序或安装程序时都会有加载。
方法
(1)[method;way;means](2)古指量度方形的法则(3)现指为达到某种目的而采取的途径、步骤、手段等方法的含义较广泛,一般是指为获得某种东西或达到某种目的而采取的手段与行为方式。它在哲学,科学及生活中有着不同的解释与定义。方法和手段是人们成功办事,或管理者实现管理目的的不可缺少的中介要素。方法虽然也被人们称之为活动的手段,但它不是物化了的手段,是人类认识客观世界和改造客观世界应遵循的某种方式、途径和程序的总和。方法的一个同义词是技术,给人的感觉,方法通俗一些,技术高雅一些。