1.源码到机器指令
.Java 源文件 ------通过Javac 编译后生成----> .class 字节码文件 -------通过jvm执行------> 机器指令
2.jvm执行过程
1)类加载器 通过双亲委派 规则进行对类的加载, 保存到方法区中, 当线程启动执行时, 根据线程执行的链路, 堆中生成所需的对象, 方法栈中通过压栈生成执行清单, 执行清单记录堆中对象执行的顺序与规则.
2)解释器 通过方法栈提供的执行清单, 对堆中的对象进行解释成为机器码, 用于服务器硬件执行.
3)JIT编译器 对频繁需要解释的代码块, 进行编译处理,减少解释过程, 提高效率.
4)垃圾回收器 对堆中存放的已无用的对象进行清除.
注:
1)本地方法栈与Java方法栈的区别:
Java方法栈保存的是Java方法信息, 本地方法栈中保存的是其他语言书写的代码信息
2)程序计数器:
记录线程切换的信息,比如线程切换回来的继续执行的代码位置等
3.双亲委派加载
类加载的过程是先由高级的类加载器进行加载操作,然后待低级类加载,当低级类加载器操作时,就会询问高级类加载器此时加载的类是否属于高级类加载器所负责的范畴,若是低级类加载器不再进行加载,若不是,低级类加载器进行加载.
双亲委派的作用: 防止类重复加载,防止包中的类被篡改.
4)类加载的 高->低 bootstrapClassLoader ---> exeClassLoader ----> appClassLoader
4.虚拟机栈
1) 异常: 线程较多,栈数越多,可能出现oom异常; 一个访问链路越多,虚拟机栈中栈帧越多,可能超出栈范围,出现sof异常.
2) 局部变量表: 存放局部变量
3) 操作数栈: 用于执行字节码指令过程中的计算.
4) 方法返回地址: 栈帧结束后返回的下一个栈帧的地址
5) 动态链接: 一个指向运行时常量池中该栈帧所属方法的引用
5.堆区
1)新生代: Eden区 S0区 S1区
Eden区是创建对象的区域,当此区域满后,就会触发一次youngGC进行回收垃圾,存活的对象转移到S0区
S0区和S1区 存放年龄小于16的对象,youngGC执行一次,存活下来的对象就会S0或S1进行转换
2)老年代: 当新生代中对象被垃圾回收器回收 16次后存活下来, 对象转移到老年代 , 区域大小比例:默认 新生代1:老年代2
注: 除新生代经历16次被回收存活下来进入老年代外, 如果创建的对象超大,Eden区放不下,则此对象创建后直接进入老年代.
6.垃圾回收器
1)
youngGC 负责新生代区域
oldGC 负责老年代区域
fullGC 负责整个堆区域
2) 判断是否为垃圾的算法:
引用计数法: 每个对象保存了一个 引用计数器属性, 如果被引用次数为零时,对象就会被回收掉.(存在循环引用问题)
可达性算法: 被引用对象作为根节点,一层一层寻找所引用的对象,如果找不到,回收被引用对象.(常用算法)
3) 垃圾回收算法:
标记-清除算法: 对已确定并且标记了是垃圾的对象, 循环遍历堆, 对已标记的对象进行删除.
复制算法: 堆空间一分为二,对象保存在其中一个区域,. 对标记不是垃圾的对象,进行复制转移到另一个区域, 对标记是垃圾的对象,进行删除.
标记-整理算法: 使用可达性算法进行判断对象是否为垃圾对象,若不是,则对象转移到堆靠前位置; 若是垃圾,则对象转移到堆靠后的位置.最后进行删除垃圾对象.