面试篇就是复习前面学的
什么是JVM
1.定义:JVM指的是Java虚拟机,本质是一个运行在计算机上的程序
2.作用:为了支持Java中Write Once ,Run Anywhere 编写一次 到处运行的跨平台特性
功能:
1.解释和运行
2.内存管理
3.即时编译
组成
常见的jvm
总结
字节码的组成
运行时数据区
方法区、堆、本地方发栈、虚拟机栈、程序计数器(后三不共享 前二共享)
直接内存主要是NIO使用,由操作系统直接管理,不属于JVM内存
程序计数器
栈-----java虚拟机栈
栈帧的组成:
1.局部变量表
2.操作数栈
3.帧数据
本地方法栈
堆
创建出来的对象都存在于堆上
栈上的局部变量表中,可以存放堆上对象的引用。静态变量也可以存放堆对象的引用,通过静态变量就可以实现对象在线程之间的共享
堆是垃圾回收的最主要部分,堆结构更详细的划分于垃圾回收器有关
方法区
直接内存
总结
哪些区域会出现内存溢出,会有什么现象?
内存溢出指的是内存某一块区域的使用量超过了允许使用的最大值,从而使用内存时因空间不足而失败,虚拟机一般会抛出指定的错误。
在java虚拟机中,只有程序计数器不会出现内存溢出情况,因为每个线程的程序计数器只保存一个固定长度的地址
堆内存溢出:
栈内存溢出:
方法区的内存溢出
直接内存溢出
总结
JVM在jdk6-8之间在内存区域上有什么不同?
1.方法区的实现
2.字符串常量池的位置
用元空间替换永久代的原因:
字符串常量池
总结
类的生命周期
加载阶段
1.加载阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制的方式获得字节码信息
程序员可以使用java代码拓展不同的渠道
2.类加载器在加载完类之后,java虚拟机会将字节码中的信息保存到内存的方法区中。在方法区生成一个InstanceKlass对象,保存类的所有信息
3.在堆中生成一份与方法区中数据类似的java.lang.Class对象,作用是在java代码中获得类的信息
连接阶段
初始化阶段
卸载阶段
总结
什么是类加载器
类加载器负责在类加载过程中将字节码信息以流的方式获得并加载到内存中。在JDK8及之前如下:
启动类加载器 JDK9之前是c++编写,之后是java编写
扩展类加载器
应用程序类加载器和自定义类加载器
总结
什么是双亲委派机制
双亲委派机制是指当一个类加载器接收到加载类的任务时,会向上查找是否加载过,再由顶向下进行加载
双亲委派机制有什么作用?
1.保证类加载的安全性
2.避免重复加载
总结
如何打破双亲委派机制
重写loadclass
Tomcat的自定义类加载器
总结
如何判断堆上的对象有没有被引用
引用计数法 可达性分析法
引用计数法会为每个对象维护一个引用计数器,当对象被引用时+1,取消引用时-1
缺点:
什么是GCRoot对象
总结
JVm有什么引用类型
Threadlocal为什么要用弱引用
总结
有什么常见的垃圾回收算法
标记清除
复制算法
标记整理算法
分代GC
概念太多了 自己回去看之前的笔记吧。。。。
有哪些常用的垃圾回收器
看之前的概念
如何解决内存泄漏
主要思路
常见的JVM参数