JVM中的相关知识
认识JVM
JVM是一种用户态的程序,通过虚拟机来屏蔽不同计算机上的硬件差异从而达到跨平台;JVM中包含JDK ,JDK时java开发工具包,而JDK中包含JRE(java运行环境),如果你想运行你的java程序,只需要安装jre即可,但是你想写一个程序,就要下载JDK ,因为JDK 中包含jre,编译器和其他的工具;
内存区域划分
JVM 的内存划分主要是堆,方法区(要执行程序的二进制字节码文件,以类对象的方式来阻止),栈,其中栈包括了程序计数器(保存了下一个程序来执行的地址),jvm栈,本地方法栈,栈中保存了很多信息,局部变量,方法之间的调用关系等信息
JVM相关的知识
局部变量 存储在栈上定义在类的方法中或者代码块中,而且他只在自己定义的方法体或者代码块内有效,并且在使用前必须进行初始化。
全局变量,存储在堆上,即不再方法体内,也不再代码块内定义的变量,并且类的所有方法和代码块都可以访问该变量,使用的时候如果没有初始化的变量系统会指定默认的值。
补充一下int 和Integer的区别
1.int 是一种基础数据类型,而Integer是int的包装类
2.Integer在使用前必须实例化才可以使用,而int不需要
3.int的默认值是0,Integer的默认值是null
4.Integer 是对象的引用,存的是地址,而int就是直接存储数据
递归方法的执行过程?
每次递归都会产生一个栈帧,同意名字的栈帧可能会在不同多个栈帧中出现,每个方法执行完毕就会销毁此栈帧,返回上一层战阵执行下一步递归
引用和对象,引用存储了对象的地址,而对象才是本体。引用数据类型和基础数据类型的区别,引用数据类型是一个地址,而基础数据类型是直接存储数据的。
普通方法和静态方法的区别?
普通方法是实例化方法,是和类的实例型关联的,而竞态方法是属于方法去的,他适合类信息相关的,与实例无关
什么类加载? 编译器通过javac把java文件编译程字节码文件(.class文件)JVM将文件加载到内存上。
类加载的步骤:
1.读取:.class文件按照格式进行加载,而jvm也会按照这个格式来进行解析
2.链接:文件中的类可能会一来到其他的类,骄傲在一些i其他的类信息
3.初始化:创建该类的对象进行初始化该类的静态成员,并且执行静态代码块中的内容
GC机制(垃圾回收机制)
垃圾回收机制本质上就是释放内存,主要回收的是堆上的对象,像那些方法区,常量池中的内存GC一般是不太关注的,因为内存小,而对上申请内存又十分频繁,所以是重点关注的对象。
类对象如何如何进行回收?
大体上是先将对象标记出来,然后将垃圾对象的内存给释放掉;
标记的方法:
1.引用计数法 顾名思义引用计数法,就是将指向该对象的引用进行计数,当计数器为0的时候,证明该对象没有其他引用了,就可以进行回收了,但是引用计数无法英法云环引用的问题,需要引入额外的开销。
2.可达性分析(java采用的机制)
栈上局部变量表中的引用Groot 每个程序都有很多个线程,每个线程有自己的栈,栈上存有大量的信息,这些就是Groot的一部分,当Groot被标记位来记得时候,其下面的可以访问到的引用也就是来及,这样就可以解决循环引用的问题(引用可以决定对象的生死)java中又多种引用
1.强引用:既能找到对象,又能决定对象的生死
2.弱引用:只能用于找对象
3.软引用:既能用于找对象,又能在一定的程度上决定对象的生死
4.虚引用 :不能用于找对象,也不能决定对象的生死
3.卸载方法区的特殊规则(类卸载):
a.当没有任何的引用指向改类的对象的时候,
b.当类的所有实例都被回收了
c该类的类加载器已经被回收了,
此时证明该类就可以被卸载了
回收的算法
1.标记-清除 缺点:同意产生内存碎片
2.标记-复制 缺点:需要更大内存空间的,有点,解决了内存碎片的文艺
3.标记整理
垃圾如何进行回收?
通过对象的年龄进行分代回收,每通过一轮GC(达性分析)该对象的年龄+1,没有用的话就会被标记成垃圾进行回收;只有极少数的对象会保留下来。
一个对象的一生:创建的时候实在伊甸区,通过一个GC 然后会被放到生存区,进行若干次GC之后存活下来的对象们就会放入到老年代中,相对来说,GC频率会比较少。
类加载
类加载是 编译器通过javac把java文件编译程字节码文件(.class文件)JVM将文件加载到内存上。
步骤 1.加载2.链接3.初始化
什么时候会触发类加载?
构造类的实例,使用类的静态方法/属性,使用子类的时候也会触发父类的加载,
只要你这个类不在内存中就需要进行加载
什么是双亲委派模型?
进行来加载的时候。有定好的顺序,当JVM加载类的时候,先把他交给系统类加载器,然后系统类加载器不会直接加载,先交给拓展类加载器,继续往上委托,父类加载失败后,就会由子加载其进行处理,如果加载失败就会抛出异常。