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

原子操作类

JAVA集合包

JAVA多线程

JAVA调优

JAVA代码调优

JVM性能调优

JAVA工具集

jstat

jmap

jps

visualVM

jstatd

jmx remote

BTrace

jmx restful api

mat