简介
JVM(Java Virtual Machine)是运行Java字节码的虚拟机,由一套字节码指令集、一组程序寄存器、一个虚拟机栈、一个虚拟机堆、一个方法区和一个垃圾回收器构成。java
运行过程
.java(源文件)-> .class(字节码文件) -> 机器码redis
构成
类加载子系统加载.class文件,数据存入运行时数据区,即时编译器(跨平台)将.class文件编程成机器码,机器码经过本地接口库调用操做系统本地方法库执行程序 算法
类比物理机
具体地,在JVM中,线程引擎对标CPU,工做内存对标高速缓存,主存对主存。当多个处理器同时对Java主存进行操做的时候就会发生不一致现象。单应用下,这种不一致能够由Java并并发包提供的方法解决。例如AtomicLong,底层是经过CAS(compareAndSwap)来实现线程的同步,是在一个死循环内不断的尝试修改目标的值,直到修改为功。分布式下则能够经过redis等组件来完成。 编程
内存模型
线程共享区与JVM共存亡,线程私有区域与线程共存亡,堆外内存能够避免Java堆和Native堆之间来回复制的性能开销,在并发编程中被普遍应用。 缓存
组件概要
- 程序计数器:线程私有,记录实时字节码指令地址,执行Native则为空,惟一没有Out Of Memory的区域
- 栈:线程私有,每一个⽅法在执⾏时都会床建立⼀个栈帧(Stack Frame)⽤于存储局部变量表 、 操做数栈 、 动态连接 、 ⽅法出⼝等信息。每⼀个⽅法从调⽤直⾄执⾏结束,就对应着⼀个栈帧从虚拟机栈中⼊栈到出栈的过程
- 本地方法区:线程私有,相似栈,区别是执行Native方法
- 堆:线程共享,存放建立的对象和产生的数据
- 方法区:线程共享,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,JDK1.8以后成为元数据区,原方法区的常量池和静态变量存在堆中,元数据区则在堆外内存!!!!!
常量池
String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = str2.intern();
System.out.println(str1==str2);//true
System.out.println(str1==str3);//false
System.out.println(str1==str4);//true
复制代码
垃圾回收
对象已死断定⽅法
- 引用计数法:对象添加一个引用,引用计数+1,反之-1,为0则认为能够回收。存在循环引用问题
- 可达性分析:以一系列GC Roots的点做为起点向下搜索,当一个对象到任何一个GC Roots都没有引用链则认为能够回收(两次标记)。
垃圾回收算法
- 复制算法:分为两个区域,只用一个区域,每次将存活的放入另外一个区域。内存浪费问题
- 标记清除算法:效率低,内存碎片问题
- 标记整理算法:标记清除的基础上,将对象放在内存的一端
- 分代收集算法
- 新生代:复制算法/...
- 老年代: 标记清除/标记整理/...
进入老年代的途径
- 复制算法S区放不下
- 对象过大,XX:PretenureSizeThreshold设置,通常为2KB~128KB
- 存活时间太久,XX:MaxTenuringThreshold设置,默认15(15次GC仍然存活)
垃圾收集器
- 新生代
- Serial:单线程,复制算法,Client默认
- ParNew:Serial多线程版(默认CPU等值线程数),Server默认
- Parallel Scavenge:多线程,复制算法,吞吐量(GC时间/总时间)
- 老年代
- CMS:标记清除,初始标记和从新标记须要STW,其余过程不须要,为了实现最短垃圾回收停顿时间
- Serial Old:单线程,标记整理,Client默认
- Parallel Old:多线程,标记整理
- G1:标记整理,内存分区,经过优先级列表回收垃圾最多的区域,保证吞吐量的前提下实现最短垃圾回收停顿时间。
引用类型
- 强引⽤
- 相似于 Object obj = new Object(); 建立的,只要强引⽤在就不回收
- 软引⽤
- SoftReference 类实现软引⽤。在系统要发⽣内存溢出异常以前,将会把这些对象列进回收范围之中进⾏⼆次回收
- 弱引⽤
- WeakReference 类实现弱引⽤。对象只能⽣存到下⼀次垃圾收集以前。在垃圾收集器⼯做时,⽆论内存是否⾜够都会回收掉只被弱引⽤关联的对象
- 虚引⽤
- PhantomReference 类实现虚引⽤。⽆法经过虚引⽤获取⼀个对象的实例,为⼀个对象设置虚引⽤关联的惟⼀⽬的就是能在这个对象被收集器回收时收到⼀个系统通知
网络编程模型
类加载机制
监控