当前位置: 首页 > 后端技术 > Java

史上最全JVM详解!java程序员的细节极其详尽,大魔王

时间:2023-04-01 21:04:18 Java

前言作为一名Java从业者,在找工作的时候,肯定会被问到JVM相关的知识。对JVM知识的掌握程度,是很多面试官眼中判断应聘者技术深度的重要标准。大多数人可能没有开发和使用JVM的实际经验。下一系列文章将带大家了解JVM需要掌握的各个知识点。这也将帮助您从初级程序员过渡到高级程序员。由于文章篇幅,文末有答案和解析目录。Threads(详解)JVM内存区(详解)JVM运行时内存垃圾回收及算法JAVA四种引用类型GC分代回收算法VS分区回收算法GC垃圾回收器JAVAIO/NIOJVM类加载机制Text1.Thread(详解)这里所说的线程是指程序执行过程中的一个线程实体。JVM允许应用程序同时执行多个线程。HotspotJVM中的Java线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对象、栈、程序计数器等准备就绪时,一个操作系统本机线程就被创建了。当Java线程结束时,本机线程被回收。操作系统负责调度所有线程并将它们分配给任何可用的CPU。初始化本机线程时,将调用Java线程的run()方法。当线程结束时,本机线程和Java线程的所有资源都会被释放。HotspotJVM后台运行的系统线程主要有以下几种:2.JVM内存区(详解)JVM内存区主要分为线程私有区【程序计数器、虚拟机栈、本地方法区】、线程共享区【JAVA堆,方法区】,直接内存。线程私有数据区的生命周期与线程相同,根据用户线程的开始/结束而创建/销毁(在HotspotVM中,每个线程直接映射到运行的本地线程系统,所以这部分内存区域的存储/是否遵循本地线程生死对应)。线程共享区随着虚拟机的启动/关闭而创建/销毁。直接内存不属于JVM运行时数据区,但也经常被使用:JDK1.4中引入的NIO提供了一种基于Channel和Buffer的IO方法,可以使用Native函数库直接分配堆外内存,以及然后使用DirectByteBuffer对象作为对这块内存的引用进行操作(详见:JavaI/OExtensions),这样就避免了在Java堆和Native堆之间来回复制数据,因此在某些场景下可以显着提高性能。1、程序计数器(线程私有)是一块很小的内存空间,它是当前线程执行的字节码的行号指示器。每个线程必须有一个独立的程序计数器。这种类型的内存也称为“线程私有”内存。如果java方法正在执行,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果仍然是本机方法,则为空。此内存区域是唯一未在虚拟机中指定任何OutOfMemoryError条件的内存区域。2、虚拟机栈(私有线程)是描述java方法执行的内存模型。每个方法在执行时都会创建一个栈帧(StackFrame)来存放局部变量表、操作数栈、动态链接和方法出口。和其他信息。每个方法从调用到执行完成的过程对应一个栈帧从入栈到出栈的过程。栈帧(Frame)是用来存储数据和一些处理结果的数据结构,也用来处理动态链接(DynamicLinking)、方法返回值和异常派发(DispatchException)。堆栈帧在调用方法时创建,在方法结束时销毁——无论方法正常完成还是异常完成(抛出未在方法中捕获的异常)都算作方法结束。3、本地方法区(线程私有)本地方法区类似于JavaStack,不同的是虚拟机栈是为执行Java方法服务的,而本地方法栈是为Native方法服务的。如果一个VM实现使用C-linkage模型来支持Native调用,那么栈就是一个C栈,但是HotSpotVM直接将native方法栈和虚拟机栈合二为一。4.堆(Heap-threadsharing)——运行时数据区是线程共享的内存区域。创建的对象和数组存放在Java堆内存中,这也是垃圾回收器进行垃圾回收最重要的内存区域。由于现代VM采用分代收集算法,因此从GC的角度也可以将Java堆细分为:新生代(Eden区、FromSurvivor区和ToSurvivor区)和老年代。5.方法区/永久代(线程共享)就是我们常说的永久代(PermanentGeneration),用来存放JVM加载的类信息,常量,静态变量,编译好的代码等数据实时编译器。HotSpotVM将GC分代收集扩展到方法区,即利用Java堆的永久代来实现方法区,让HotSpot垃圾收集器可以像管理Java堆一样管理这部分内存,而无需开发方法区的特殊内存管理(永久带内存回收的主要目标是常量池的回收和类型的卸载,所以收益一般很小)。运行时常量池是方法区的一部分。Class文件中除了类版本、字段、方法、接口等描述信息外,还有一条信息就是常量池(ConstantPoolTable),用于存放编译时产生的各种字面量和符号引用.这部分内容会在类加载完成后存放在方法区的运行时常量池中。Java虚拟机对Class文件的每一部分(自然包括常量池)的格式都有严格的规定。每个字节用来存储的数据必须符合规范的要求,才能被虚拟机识别。加载并执行。更多分析:3.JVM运行时内存新生代老年代永久代4.垃圾收集与算法5.JAVA中的引用类型4.强引用、软引用、弱应用、虚引用6.GC分代收集算法VS分区收集算法分代收集算法的朋友可以[点此获取](https://docs.qq.com/doc/DY0Fr...)Serialgarbagecollector(singlethread,copyalgorithm)ParNewgarbagecollector(Serial+multithreading)ParallelScavengeCollector(多线程复制算法,效率高)SerialOldCollector(单线程标记整理算法)ParallelOldcollector(多线程标记整理算法)CMS收集器(多线程标记清除算法)G1收集器(解析)G1收集器Garbagefirst垃圾收集器最垃圾收集器理论发展的前沿成果。与CMS收集器相比,G1收集器最突出的两个改进是:1、基于标记排序算法,不产生内存碎片。2.可以非常精确地控制暂停时间,可以在不牺牲吞吐量的情况下实现低暂停垃圾收集。G1收集器避免了全区垃圾收集。它将堆内存划分为几个独立的固定大小的区域,并跟踪这些区域的垃圾回收进度。同时,它在后台维护一个优先级列表。每次根据允许的收集时间,先收集垃圾最多的区域。区域划分和优先区域回收机制保证G1收集器在有限的时间内获得最高的垃圾收集效率。8.JAVAIO/NIO阻塞IO模型非阻塞IO模型多路复用IO模型信号驱动IO模型异步IO模型JAVAIO封装JAVANIOChannelBufferSelector9.JVM类加载机制加载、验证、准备、解析符号引用、直接引用初始化类ConstructorClassLoaderParentDelegationOSGI(动态模型系统)【点击获取资料】(https://docs.qq.com/doc/DY0Fr...)!Java架构学习资料比较多,涵盖了互联网的方方面面。期间在各种产品的各种场景中遇到了各种问题,希望能帮助大家扩展技术广度和知识面。