!.从进阶到脑死亡的问题
前言
聊聊常见的面试题
1、请你谈谈你对JVM的理解? java8 虚拟机有什么更新?
2、什么是OOM,请你说说OOM产生的原因?如何分析?
3、JVM 的常用调优参数有哪些?
4、内存快照抓取,如何分析,命令是什么?
5、堆里面分区:Eden、Survial(from to)、老年区
6、GC垃圾收集算法有那个几个?谈谈利弊?
BAT 难度的面试题
1、JVM 垃圾回收的时候如何确定垃圾,GC Roots?
2、-X、 -XX 参数你用过哪些?
3、你常用的项目,发布后配置过JVM 调优参数吗?
4、引用、强引用、弱引用、虚引用都是什么,请你谈谈?
5、GC垃圾回收器和GC算法的关系?分别有哪些?
6、谈谈默认的垃圾回收器?
7、G1垃圾回收器的特点?
8、OOM 你看过几种?
1.1什么是jvm
JVM是一种用于计算设备的规范,它是一个虚构出来的计算机
使用JVM就是为了支持与操作系统无关,实现跨平台
1.2JVM内存区域划分
JVM的内部体系结构分为三部分,分别是:类装载器(ClassLoader)子系统,运行时数据区,和执行引擎。
1.2.1类加载器ClassLoader
类的加载、链接和初始化(了解)
加载:查找并加载类的二进制数据
连接:
- 验证:保证被加载的类的正确性;
- 准备:给类静态变量分配内存空间,赋值一个默认的初始值;
- 解析:把类中的符号引用转换为直接引用
在把java编译为class文件的时候,虚拟机并不知道所引用的地址;助记符:符号引用!
转为真正的直接引用,找到对应的直接地址!
初始化:给类的静态变量赋值正确的值;
public class Test{
public static int a = 1;
}
// 1、加载 编译文件为 .class 文件,通过类加载,加载到JVM
// 2、连接
验证(1) 保证Class类文件没有问题
准备(2) 给int类型分配内存空间,a = 0;
解析(3) 符号引用转换为直接引用
// 3、初始化
经过这个阶段的解析,把1 赋值给 变量 a;
// JVM 参数:
// -XX:+TraceClassLoading // 用于追踪类的加载信息并打印出来
// 分析项目启动为什么这么慢,快速定位自己的类有没有被加载!
// rt.jar jdk 出厂自带的,最高级别的类加载器要加载的!
public class Demo02 {
public static void main(String[] args) {
System.out.println(MyChild1.str2);
// 运行的结果
/**
* MyParent1 static
* MyChild1 static
* hello,str2
*/
}
}
class MyParent1{
public static String str = "hello,world";
static {
System.out.println("MyParent1 static");
}
}
class MyChild1 extends MyParent1{
public static String str2 = "hello,str2"; //如果final修饰 只会打印 "hello,str2" 常量在编译阶段的时候 常量池
static {
System.out.println("MyChild1 static");
}
}
ClassLoader 分类
1、java虚拟机自带的加载器
- BootStrap 根加载器 (加载系统的包,JDK 核心库中的类 rt.jar)
- Ext 扩展类加载器 (加载一些扩展jar包中的类)
- Sys/App 系统(应用类)加载器 (我们自己编写的类)
2、用户自己定义的加载器
- ClassLoader,只需要继承这个抽象类即可,自定义自己的类加载器
双亲委派机制
双亲委派机制 可以保护java的核心类不会被自己定义的类所替代
一层一层的让父类去加载,如果顶层的加载器不能加载,然后再向下类推
// Demo01
// AppClassLoader 03
// ExtClassLoader 02
// BootStrap (最顶层) 01 java.lang.String rt.jar
1.2.2.运行时数据区
Stack 栈是什么
栈就是管理程序运行的
存储一些基本类型的值,对象的引用,方法等…
栈的优势:存取速度比堆快!仅次于寄存器,栈的数据是不可以共