jvm虚拟机那些面试干货
1.Jdk、jre、jvm
Jdk:java开发的工具箱,java开发的核心,里面包含了jre、javac的工具类,原生API
分为三个版本:javaSE、javaEE、javaME
jre:java运行时的环境,底层依赖于虚拟机
jvm:java虚拟机,实现跨平台的核心
-XX:+HeapDumpOnOutOfMemoryError 内存溢出转存到文件,文件默认存在项目目录下
-Xms20m -Xmx20m 内存设置
2.java的发展历史
3。JAVA虚拟机的发展
4.JAVA虚拟机内存管理
线程共享区:方法区、java堆 线程独占区:虚拟机栈、本地方法栈、程序计数器 方法区:类信息、常量、静态变量(存储运行时常量池、及时编译器编译后的代码) 虚拟机栈:局部变量、动态方法、返回地址(存放方法运行时所需要的数据,成为栈帧) 本地方法栈:为JVM所调用到的Native脚本地方法服务 堆:内存区域、对象实例 程序计数器:记录当前程序所执行到的字节码的行号 堆:先进先出 栈:先进后出 1.堆溢出:不断地new对象 2.栈溢出:死循环、递归无终止 3.内存泄漏:分配的内存未被回收 4.内存溢出:内存不够
5。JVM回收机制
1.GC发生在堆中 2.Gc是什么 分代收集算法 频繁收集 Young区 Minor GC 较少收集 Old区 FullGC 不动 Perm区(永久区) 3.GC算法 a.引用计数法 现已被淘汰,原因:较难解决循环引用 b.复制算法 Minor GC使用 缺点:双倍空间 优点:效率高 c.标记清楚算法:清楚无标记的 老年代一般是标记清楚和标记压缩混用 缺点:两次扫描耗时,会产生内存碎片 优点:不需要空间 d.标记压缩算法: 缺点:两次扫描耗时,移动对象 优点,不会产生碎片 e:标记清除压缩算法:先标记、再清楚、最后压缩 4.GC在什么时候,对什么东西做了什么事情 新生代:老年代=1:2 新生代有一个Eden 区和两个survivor 区构成,比例为:Eden: su:su=8:1:1 1.首先会把对象放入Eden区,当 Eden 空间不足,会先放其中一个survivor区,如果仍然放不下,,引发一次 minor GC, 将存活的对象放人另一个survivor 区清空 Eden 区和之前的survivor 区,survivor区,在某次GC 后发现仍然放不下将对象存入老年代内存 2.大对象及长期存活的对象直接放人老年代 3.进行minor GC 时发现老年代还是不够放, 进行一次 full GC 对什么东西 从 GCROOt 中搜索不到,且经过一次标记清理仍然未复活的对篆 做什么 新生代:复制清理 老年代:标记清理和标记/压缩 永久代:存放类和类加载器 5. 类加载器工作机制 1.装载:将java 二进制代码导入 JVM 中生成class 文件 2.连接:a:校验 b:准备(分配存储空间)C:解析 3.初始化:静态变量、静态方法、静态代码块