Java基础知识
一、JVM内存模型
其中栈、本地方法区、程序计数器为线程私有,堆、方法区为线程共享。
二、JVM内存回收机制
GC Root
- 栈;
- 本地方法区;
- 方法区;
GC 算法
- 标记-清理:缺点为容易产生内存碎片;
- 标记-整理:缺点为资源开销较大;
- 复制回收:缺点为需要2倍内存;
-
Young GC:当Eden区快要满的时候,使用复制回收算法,把未标记的对象复制到S0区,然后清理E区和S1区;
当下次E区快满时,将E区 + S0区幸存对象复制到S1区。然后是交替往复的工作,即E + S1-->S0,
E + S0-->S1,E + S1-->S0... -
Full GC:如果对象被回收1次,其age加1。如果age>=15(默认),则不放入S区,而是放入Old区。此外,Old区还存放大对象,避免
多次复制导致的系统开销。如果Old区满了,则会触发Old GC,一般会伴随Young GC,称之为Full GC。此时,会
stop the work,采用标记-清理或标记-整理算法进行垃圾回收。 - 当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。对象晋升到老年代的年龄阈值,可以通过参数 -XX:MaxTenuringThreshold 来设置。
-
🐛 修正(参见:issue552) :“Hotspot 遍历所有对象时,按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了 survivor 区的一半时,取这个年龄和 MaxTenuringThreshold 中更小的一个值,作为新的晋升年龄阈值”。
- 总结:Young GC主要采用复制回收算法,Full GC采用标记-清理或标记-整理算法。新生代的垃圾回收器有ParNew,老年代的垃圾回收器有CMS。
三、其他Java基础知识
1、基本概念
1.Java程序初始化的顺序是怎样的?
Java程序初始化一般遵循3个原则(优先级依次递减):
1)静态对象(变量)优先于非静态对象(变量)初始化,其中静态对象只初始化1次,非静态对象可以初始多次;
2)父类优先于子类进行初始化;
3)按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化。
Java程序初始化工作可以在许多不同的代码块中来完成(例如:静态代码块、构造函数等),它们的执行顺序如下(按照三段式记忆):
即:1、父类静态变量和静态代码块(先声明的先执行);2、子类静态变量和静态代码块(先声明的先执行);
3、父类的变量和代码块(先声明的先执行);
4、父类的构造函数;
5、子类的变量和代码块(先声明的先执行);
6、子类的构造函数。
2.Java中的作用域有哪些?
Java语言中,变量类型主要有3种:成员变量、静态变量和局部变量。其中局部变量的作用域与可见性为它所在的花括号内;静态变量的作用范围与类的实例化对象的作用范围和生命周期一致。
成员变量作用域如下:
作用域与可见性 | 当前类 | 同一个包 | 子类 | 其他包 |
public
|
T |
T |
T |
T |
private |
T |
F | F | F |
protected
|
T |
T |
T |
F |
default |
T |
T |
F | F |
3.什么是反射机制?
反射机制,允许程序在运行时进行自我检查,同时也允许对其内部但成员进行操作。具体而言,反射机制的主要功能有:1)得到一个对象所属的类;2)获取一个类的所有成员变量和方法;
3)在运行时创建对象;4)在运行时调用对象的方法。
除此之外,反射机制的非常重要的作用就是可以在运行时动态地创建类的对象。得到class类的3种方法:1)Class.forName(“类的路径”);2)类名.Class;3)实例.getClass()。