前言作为 Java 的从业者,在找工作的时候,肯定会被问及对于 JVM 相干的常识。JVM 常识的把握水平,在很多面试官眼里是候选人技术深度的一个重要评判规范。而大多数人可能没有对 JVM 的理论开发和应用教训,接下来这一系列文章将带你深刻理解 JVM 须要把握的各个知识点。这也将帮忙你实现从高级程序员到高级程序员的转变。因为文章篇幅起因,文末有答案和解析目录线程(详解)JVM 内存区域(详解)JVM 运行时内存垃圾回收与算法 JAVA 四种援用类型 GC 分代收集算法 VS 分区收集算法 GC 垃圾收集器 JAVA IO/NIOJVM 类加载机制注释一、线程 (详解) 这里所说的线程指程序执行过程中的一个线程实体。JVM 容许一个利用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有间接的映射关系。当线程本地存储、缓冲区调配、同步对象、栈、程序计数器等筹备好当前,就会创立一个操作系统原生线程。Java 线程完结,原生线程随之被回收。操作系统负责调度所有线程,并把它们调配到任何可用的 CPU 上。当原生线程初始化结束,就会调用 Java 线程的 run() 办法。当线程完结时,会开释原生线程和 Java 线程的所有资源。Hotspot JVM 后盾运行的零碎线程次要有上面几个:
二、JVM 内存区域(详解)
JVM 内存区域次要分为线程公有区域【程序计数器、虚拟机栈、本地办法区】、线程共享区域【JAVA 堆、办法区】、间接内存。线程公有数据区域生命周期与线程雷同, 依赖用户线程的启动 / 完结 而 创立 / 销毁(在 HotspotVM 内, 每个线程都与操作系统的本地线程间接映射, 因而这部分内存区域的存 / 否追随本地线程的生 / 死对应)。线程共享区域随虚拟机的启动 / 敞开而创立 / 销毁。间接内存并不是 JVM 运行时数据区的一部分, 但也会被频繁的应用: 在 JDK 1.4 引入的 NIO 提供了基于 Channel 与 Buffer 的 IO 形式, 它能够应用 Native 函数库间接调配堆外内存, 而后应用 DirectByteBuffer 对象作为这块内存的援用进行操作(详见: Java I/O 扩大), 这样就防止了在 Java 堆和 Native 堆中来回复制数据, 因而在一些场景中能够显著进步性能。
1、程序计数器 (线程公有) 一块较小的内存空间, 是以后线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程公有”的内存。正在执行 java 办法的话,计数器记录的是虚拟机字节码指令的地址(以后指令的地址)。如果还是 Native 办法,则为空。这个内存区域是惟一一个在虚拟机中没有规定任何 OutOfMemoryError 状况的区域。2、虚拟机栈 (线程公有) 是形容 java 办法执行的内存模型,每个办法在执行的同时都会创立一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动静链接、办法进口等信息。每一个办法从调用直至执行实现的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。栈帧(Frame)是用来存储数据和局部过程后果的数据结构,同时也被用来解决动静链接(Dynamic Linking)、办法返回值和异样分派(Dispatch Exception)。栈帧随着办法调用而创立,随着办法完结而销毁——无论办法是失常实现还是异样实现(抛出了在办法内未被捕捉的异样)都算作办法完结。
3、本地办法区 (线程公有)本地办法区和 Java Stack 作用相似, 区别是虚拟机栈为执行 Java 办法服务, 而本地办法栈则为 Native 办法服务, 如果一个 VM 实现应用 C-linkage 模型来反对 Native 调用, 那么该栈将会是一个 C 栈,但 HotSpot VM 间接就把本地办法栈和虚拟机栈合二为一。4、堆(Heap- 线程共享)- 运行时数据区是被线程共享的一块内存区域,创立的对象和数组都保留在 Java 堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。因为古代 VM 采纳分代收集算法, 因而 Java 堆从 GC 的角度还能够细分为: 新生代( Eden 区、From Survivor 区 和 To Survivor 区) 和老年代。5、办法区 / 永恒代(线程共享)即咱们常说的永恒代(Permanent Generation), 用于存储被 JVM 加载的类信息、常量、动态变量、即时编译器编译后的代码等数据. HotSpot VM 把 GC 分代收集扩大至办法区, 即应用 Java 堆的永恒代来实现办法区, 这样 HotSpot 的垃圾收集器就能够像治理 Java 堆一样治理这部分内存, 而不用为办法区开发专门的内存管理器(永恒带的内存回收的次要指标是针对常量池的回收和类型的卸载, 因而收益个别很小)。运行时常量池(Runtime Constant Pool)是办法区的一部分。Class 文件中除了有类的版本、字段、办法、接口等形容等信息外,还有一项信息是常量池 Constant Pool Table),用于寄存编译期生成的各种字面量和符号援用,这部分内容将在类加载后寄存到办法区的运行时常量池中。Java 虚拟机对 Class 文件的每一部分(天然也包含常量池)的格局都有严格的规定,每一个字节用于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载和执行。更多解析:
三、JVM 运行时内存新生代老年代永恒代
四、垃圾回收与算法如何确定垃圾标记革除算法(Mark-Sweep)复制算法(copying)标记整顿算法 (Mark-Compact) 分代收集算法
五、JAVA 四中援用类型强援用软援用弱利用虚援用
六、GC 分代收集算法 VS 分区收集算法分代收集算法分区收集算法
七、GC 垃圾收集器文章材料都整顿在一个文档外面了,须要的敌人能够[点击这里即可获取](https://docs.qq.com/doc/DY0Fr…)Serial 垃圾收集器(单线程、复制算法)ParNew 垃圾收集器(Serial+ 多线程)Parallel Scavenge 收集器(多线程复制算法、高效)Serial Old 收集器(单线程标记整顿算法)Parallel Old 收集器(多线程标记整顿算法)CMS 收集器(多线程标记革除算法)G1 收集器(解析)G1 收集器(解析)Garbage first 垃圾收集器是目前垃圾收集器实践倒退的最前沿成绩,相比与 CMS 收集器,G1 收集器两个最突出的改良是:1. 基于标记 - 整顿算法,不产生内存碎片。2. 能够十分准确管制进展工夫,在不就义吞吐量前提下,实现低进展垃圾回收。G1 收集器防止全区域垃圾收集,它把堆内存划分为大小固定的几个独立区域,并且跟踪这些区域的垃圾收集进度,同时在后盾保护一个优先级列表,每次依据所容许的收集工夫,优先回收垃圾最多的区域。区域划分和优先级区域回收机制,确保 G1 收集器能够在无限工夫取得最高的垃圾收集效率。
八、JAVA IO/NIO 阻塞 IO 模型非阻塞 IO 模型多路复用 IO 模型信号驱动 IO 模型异步 IO 模型 JAVA IO 包 JAVA NIOChannelBufferSelector
九、JVM 类加载机制加载、验证、筹备、解析符号援用、间接援用初始化类结构器 <client> 类加载器双亲委派 OSGI(动静模型零碎)
[点击获取材料](https://docs.qq.com/doc/DY0Fr…)!还有更多的 Java 架构学习材料,其中笼罩了互联网的方方面面,期间碰到各种产品各种场景下的各种问题,心愿能够帮忙大家扩大本人的技术广度和知识面。