jvm 知识总结
1.什么是jvm
java 虚拟机,通过在真实计算机上模拟仿真各种计算机功能实现,(为什么要模拟各种计算机功能,不同的操作系统本质什么不同导致了不能直接运行),包括 一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆,和一个存储方法域等组成。 jvm屏蔽了与操作系统平台相关的信息,使得java程序只需要生成在java虚拟机上执行的字节码文件,就可以在多种平台上运行。这也是java能够"一次编译,到处运用"的原因。
2.jdk,jre,jvm的关系
3.jvm内存结构
线程私有:程序计数器,虚拟机栈(线程),本地方法栈 线程共享:方法区(永久代),Java堆(新生代,老年代,异常) 直接内存
4.各个区域的生命周期:
线程私有数据区域生命周期与线程相同,依赖用户线程的启动/结束 而创建/销毁(在HotSpot VM内,每个线程都与操作系统的本地线程直接映射,因此这部分内存区域的开始/结束 与本地线程的 开始/结束 对应) 线程共享区域随着虚拟机的启动/关闭 而创建/销毁。 直接内存
5.简述堆每个区域的理解
程序计数器: 记录当前线程执行字节码指令集的行号。每条线程都有一个独立的程序计数器,程序技术器属于线程私有内存 正在执行java方法的话,程序计数器记录的是虚拟机执行的当前指令的地址,如果是native方法,则为空 什么是native方法(本地方法,c语言中的概念,类似于java的jar包) 虚拟机栈:java方法执行的内存模型,每个方法在执行的同时会创建一个栈帧,一个栈帧包括局部变量表,操作栈,动态连接和返回地址。虚拟机栈也具体先进先出的原则,先被加载的方法最后出栈,一个方法执行完毕就会出栈,一个方法从调用直至执行完成的过程,对应一个栈帧在虚拟机栈中入栈到出栈的过程。(无论是正常完成完成还是异常完成,都算做方法结束) 局部变量:方法的局部变量, jvm 指令 iconst_1 在局部变量表中创建一个 istore_1 操作栈 iload_1 将 加载到操作栈 iadd 将操作栈栈顶的两个元素相加 动态链接 返回地址 :方法出口 本地方法栈 堆:保存创建的对象和数组,线程共享 新生代(1/3堆空间):eden(8/10),from survivor(1/10),to survivor(1/10) 老年代(2/3堆空间):old 方法区存储被jvm加载的类信息,常量,静态变量,即时编译后的代码等等,
6.垃圾回收(如何确定垃圾,回收算法)
1.如何确定垃圾 a. b.可达性分析 2.回收算法 a.标记清除算法 b.复制算法 c.标记整理算法 d.分代收集算法 *新生代--复制算法 *老年代--标记清除或标记整理算法