1.jvm的主要组成部分及其作用
1.类加载器:加载到类文件的内存中。Classloader只管加载,只要符合文件结构就加载。至于能不能运行,他不负责
2.执行引擎:也叫作解释器,负责解释命令,交由操作系统执行
3.本地库接口:作用是融合布偶听的语言为java所用
4.运行时数据区
1).堆 是java的对象存储区域,任何new字段分配的java对象实例和数组,都被分配到堆上,java堆可以-Xms和-Xmx进行内存控制,jdk1.7以后,运行时常量池从方法区移到堆上。主要是经常变的东西,容易变。垃圾回收的主阵地
2).方法区:用于存储已被虚拟机加载类信息,常量,静态变量。是数据中的不变的部分
3).虚拟机栈:虚拟机中执行每个方法的时候,都会创建一个用于栈帧用于局部变量表,操作数栈,动态链接、方法出入口
4)本地方法栈:为JNI方法用的
5)程序计数器:
2.双亲委派模式
如果一个类加载器收到类加载的请求,他首先不会自己去尝试加载这个类,而是把这个请求委派给其父类加载,如果没有找到时才尝试自己去加载。
好处
1.使得java类随着它的类加载器一起具有一种带有优先级的层级,从而使得基础类得到统一
2.避免了多份同样的字节码文件加载
3.java的四种引用对象
1.强引用
Object obj=new Object()
只要强引用存在,垃圾回收器永远不会回收被引用的对象, 如果想要中断强引用与对象之间的联系,可以显示的赋值null
2.软引用
软引用是用来描述一些非必须但仍有用的对象。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存。垃圾回收集并不像其收集弱可及的对象一样尽量的地收集软可用对象,相反,它只在真正需要内存时才收集软可及对象
3.弱引用
无论内存是否足够,只要jvm开始进行垃圾回收,那些被弱引用关联的对象都会被回收。
4.虚引用
如果一个对象仅仅持有虚引用,那模她就没有任何引用一样,他随时都可以被收回
4.内存回收算法
1.引用算法
优点:引用算法收集器可以很快的执行,交织在程序中运行。对程序需要不被长时间打断的实时环境比较有利
缺点:无法检测出循环引用,如父对象有一个对象的引用,子对象反过来引用父对象。这样 他们的引用计数器永远不能为0
2.可达性分析
可达性分析算法从一个节点GC ROOT开始,寻找对应的引用节点,找到这个节点以后,继续寻找这个节点的引用节点,当所有的引用节点寻找完毕之后,剩余的节点被认为是没有被引用到节点,即无用的节点,无用的节点将会被判定为可回收的对象。
如果对象进行可达性分析后发现没有与GC相连接的引用链。那它将会被第一次标记并且第一筛选,筛选条件是此对象是否有必要执行finapze()方法。程序中可以通过覆盖finapze()来一场惊心动魄的自我拯救过程,但是这只有一次机会哦。
5.内存具体回收的算法
1.标记-清除算法
2.复制算法
3.分代收集器
目前大部分新生代采用复制算法 8:1:1
老年代采用:标记-清除算法
6.GC是什么时候触发的
1.ScavengeGC
2.Full GC
对整个堆进行整理,