# JAVA 继承时父子类的初始化顺序是怎样的
具体顺序如下
- 父类 -- 静态变量
- 父类 -- 静态初始化块
- 子类 -- 静态变量
- 子类 -- 静态初始化块
- 父类 -- 变量
- 父类 -- 初始化块
- 父类 -- 构造器
- 子类 -- 变量
- 子类 -- 初始化块
- 子类 -- 构造器
总结如下:静态优于非静态,父类优于子类,变量优于初始化块优于构造器
# JVM 的双亲委派模型
为什么设计,有何好处
- 确保安全,避免 JAVA 核心类库被修改
- 避免重复加载
- 保证类的唯一性
可以打破双亲委派模型吗?如何打破?
可以。自定义一个类加载器,重写其中的 loadClass
方法,使其不进行双亲委派即可
# 什么是内存溢出,什么是内存泄露
内存溢出:指程序申请内存时,没有足够的内存空间供其使用,抛出 OutOfMemory
内存泄露:指程序运行后,没有释放所占用的内存空间,一次泄露没有太大问题,长时间内存泄露会导致可用内存减少,最终导致内存溢出
# 线上项目 JVM 怎么设置
假设线上 4 核 8G 机器
JVM: 栈,堆,元空间
- 栈:1m,-xss512k (改为 512k), 一个线程是 1m, 一个线上项目 Tomcat 可能有 300 个线程,300m;
- 堆:大概把机器一半的内存给堆 (新生代,老年代)
- 元空间:一般 512M 够用