JAVA 基本问题列表 - njkfei/java_basic GitHub Wiki
JAVA学习总结
JAVA基础
JAVA类加载机制
双亲委托
class字节码文件加载流程
解析-> 验证 ->加载
JAVA类初始化顺序
- 父类--静态变量
- 父类--静态初始化块
- 子类--静态变量
- 子类--静态初始化块
- 父类--变量
- 父类--初始化块
- 父类--构造器
- 子类--变量
- 子类--初始化块
- 子类--构造器
JVM原理
JVM内存模型
JVM内存分为五大部分。
- JAVA堆
- 虚拟机栈
- 本地方法栈
- PC指针
- 运行时常量区
JAVA堆
存放数据的地方,即对象的引用。 JAVA堆是离散的,随着对象的分配和回收,容易形成碎片,所以需要进行垃圾回收。 JAVA堆是性能优化的热点
虚拟机栈
存放代码的地方 本地变量在这里产生 返回值也在这里 虚拟机栈存放的是线程运行的快照 虚拟机栈的大小,决定了线程的数量,线程数量的调优,与栈的参数有关
本地方法栈
PC指针
PC指针存放当前运行的线程中,将到执行的下一行代码 当线程被调度休眠后,PC指针存储在栈中
运行时常量区
存放类实例,静态变量的地方。
JVM分代算法
为什么要分代
根据局部性原理,系统中大部分对象是只用一次,用后即焚。有部分池对象,例如各种池(连接池,线程池)这类对象的生存周期较长, 因此,需要根据对象的生存周期层次,使用分代机制,进行垃圾回收
。
堆区分类
新生代区
刚生成的对象,就存储在新生代区。 新生代区频繁的进行对象的分配和释放 新生代区频繁的进行垃圾回收
老年代区
新生代的对象经过几次折腾后,如果还没有被回收掉,就放到老年代里面了。 老年代不经折腾,千万不要在老年代进行回收 如果老年代回收比较频繁,那么,要看看是不是有内存泄漏了
永久代区
永久代存放类和方法信息,一般不会对这个区域进行垃圾回收的。
JAVA并发包
CopyOnWriteXXX
适合读多写少的场合
ConcurrentHashMap
非阻塞
BlockingXXX
适合于生产者,消费者模型,不需要加锁
AtomicXXX
原子操作类