还剩29页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
虚拟机JVM深入探索Java虚拟机的构建原理和工作机制,掌握JVM在程序运行过程中的核心功能和优化策略虚拟机的概念与作用JVM概念作用JVM JavaVirtual Machine是一JVM负责加载、解释和执行Java种用于执行Java字节码的虚拟机,程序,并提供内存管理、垃圾回收它提供了一个标准化的运行环境,等功能,确保Java应用程序的安全使Java程序可以跨平台运行性和可靠性优势JVM的平台无关性使Java程序能够在不同操作系统上运行,提高了开发和部署的效率同时JVM还提供了内存管理等服务,简化了开发工作的体系结构JVMJVM(Java虚拟机)是Java平台的核心组件之一,提供了一个独立于硬件和操作系统的运行环境它主要由类装载器、执行引擎、内存管理子系统等模块组成,共同完成Java程序的编译、加载、执行等过程JVM体系结构的设计使得Java程序能够跨平台运行,提高了开发效率和代码可移植性同时,JVM还提供了内存管理、线程调度等功能,确保Java程序的安全性和稳定性类的加载机制加载JVM通过类加载器将类的字节码从磁盘或网络加载到内存中验证JVM会对加载的字节码进行语法检查和结构验证,确保其合法性准备JVM会为类的静态变量分配内存,并赋予默认初始值解析JVM将常量池中的符号引用替换为直接引用类加载器的类型启动类加载器扩展类加载器应用程序类加载器自定义类加载器作为JVM的一部分,负责加载负责加载$JAVA_HOME/lib/ext负责加载应用程序的类路径上应用程序可以通过继承核心Java类,如Java API提供目录下的类它是启动类加载指定的类它是扩展类加载器ClassLoader类来自定义类加载的类它是所有类加载器的祖器的子加载器的子加载器器,以实现特定的加载策略先执行引擎Java虚拟机的执行引擎是实现Java程序运行的核心部分它负责解释或编译字节码指令,并在运行时调用操作系统的功能,完成程序的执行执行引擎采用解释器和即时编译器相结合的方式,以提高Java程序的执行效率执行引擎包括指令集解释器、JIT编译器和垃圾回收器等模块它会根据程序运行的实际情况,动态选择最优的执行方式,为应用程序提供高性能的运行环境内存管理子系统内存分配和回收垃圾收集器12JVM负责管理Java应用程序使JVM提供了多种垃圾收集算法,用的内存,包括分配对象到堆内如复制算法、标记-清除算法和存以及回收不再使用的对象标记-整理算法,以有效回收内存内存分代并发回收34JVM将堆内存划分为新生代和现代JVM采用并发回收技术,减老年代,根据对象生命周期特点少垃圾收集对应用程序的暂停采用不同算法进行回收时间,提高运行效率方法区方法区的作用方法区的特点方法区的内容方法区的管理方法区是JVM用来存储类的结方法区是线程共享的,所有线方法区中存储了类的版本信息JVM会根据需要自动回收方法构信息,如类名、方法名、变程都可以访问方法区中的数据、字段、方法、接口等数据,区中的无用类通常使用引用量名等元数据它为程序的执它还是永久代的一部分,使以及一些常量和静态变量这计数算法或可达性分析算法进行提供必要的信息支持用的是本地内存些信息在类的整个生命周期内行垃圾收集都会保存堆内存分配垃圾回收分代管理JVM的内存管理子系统负责对象的内存分配堆内存使用完毕后,需要通过垃圾收集器对堆内存被划分为新生代和老年代,通过分代和回收,其中堆是储存对象实例的主要区域无用对象进行回收,以释放内存空间收集算法提高垃圾回收的效率虚拟机栈执行线程的运行环境方法调用的存储结构12虚拟机栈为每个线程提供私有的内存空间,用于存储方法调用每个方法执行时都会创建一个栈帧,用于存储局部变量表、操过程中的各种数据和局部变量作数栈、动态链接等信息栈帧的生命周期异常处理机制34当一个方法被调用时,一个新的栈帧被创建并压入虚拟机栈,当方法抛出异常时,JVM会逐层查找当前栈帧,直到找到合适方法执行完毕后该栈帧出栈的异常处理器进行处理程序计数器程序计数器简介单线程模式多线程模式程序计数器是JVM中的一个重要组成部分,在单线程模式下,程序计数器仅记录当前线在多线程模式下,程序计数器用于记录各个用于记录当前线程所执行的字节码的位置程所执行的位置它是线程私有的,每个线线程所执行的位置线程切换时,需要保存它会随着指令的执行而不断改变程都有自己独立的程序计数器和恢复程序计数器的值,以便恢复现场本地方法栈存储本地方法方法调用Native本地方法栈用于存储被JVM调用当Java程序调用Native方法时,的本地方法native方法的状态,JVM就会立即切换到本地方法栈每个线程都有自己的本地方法栈来执行这些用C/C++实现的方法线程独立与虚拟机栈一样,每个线程都拥有独立的本地方法栈,不会相互影响垃圾回收算法引用计数算法1跟踪对象引用次数复制算法2复制存活对象到另一块内存区域标记清除算法-3标记无用对象,清除它们虚拟机使用的主要垃圾回收算法包括引用计数算法、复制算法和标记-清除算法这些算法各有优缺点,需要根据具体场景进行选择引用计数算法引用计数原理引用计数算法通过为每个对象维护一个引用计数器来判断对象是否还在被使用当引用计数为0时,对象可以被回收引用加减在创建对象或者赋值时引用计数加1,在引用失效时引用计数减1缺点与应用无法处理循环引用的问题,但简单高效,在简单的应用中仍有广泛应用复制算法原理特点应用场景复制算法是通过将可回收对象相比标记-清除算法,复制算法复制算法通常应用于新生代对划分为两个等大的区域,每次可以提高内存的利用率,同时象的回收,因为新生代中存活仅对其中一个区域进行垃圾回减少了内存碎片化的问题但对象较少,复制效率较高而收存活的对象被复制到另一需要额外的内存空间来存放复在老年代中,复制效率较低,更个区域,从而达到清理内存的制对象适合使用其他算法目的标记清除算法-标记阶段首先标记出所有需要回收的对象,通常是从根节点开始遍历引用链清除阶段在标记完成后,统一回收所有被标记的对象这种算法容易产生内存碎片优化变种标记-清除-整理算法可以解决内存碎片的问题,是各大JVM的默认垃圾收集器标记整理算法-标记阶段整理阶段12首先遍历所有对象,标记出哪在标记完成后,统一回收掉所些对象是存活的这通常通过有标记为死亡的对象然后将可达性分析来实现存活的对象都移动到一端,使内存中不会出现碎片特点3标记-整理算法能够解决标记-清除算法产生的内存碎片问题,提高内存利用率但执行效率略低于标记-清除算法分代收集算法针对对象生命周期新生代高效收集分代收集算法根据对象的生命周新生代对象存活时间短,使用复制期特点,将内存分为新生代和老年算法高效回收老年代对象存活代,对不同代采用不同的垃圾收集时间长,使用标记-整理算法策略减少全堆扫描只对新生代进行频繁收集,减少了对整个堆进行全面扫描的需求,提高了垃圾收集效率内存模型JavaJava内存模型定义了Java程序中各种变量的访问规则,确保了Java程序在多线程环境下的执行的正确性它描述了Java虚拟机如何与计算机的内存系统进行交互Java内存模型包括了程序计数器、虚拟机栈、堆、方法区等多个运行时数据区域,这些区域都有自己的内存访问机制和线程隔离策略关键字volatile语义定义内存可见性禁止指令重排序应用场景volatile关键字用于修饰Java volatile确保变量的读写都直volatile禁止JVM对该变量的volatile常用于实现线程间的变量,表示该变量随时可能发接操作主内存,而不是CPU缓存读写操作进行指令重排序,保通信,如线程状态标志、双重生变化,需要从主内存中读取,,确保变量的内存可见性证volatile变量的有序性检查锁单例模式等而不能使用CPU缓存中的副本原则happens-before时间顺序关系线程通信的同步内存模型的约束Javahappens-before原则定义了Java内存模型happens-before原则可以用来保证线程间的happens-before原则是Java内存模型的一中变量操作的偏序关系它描述了两个操作通信,确保一个线程对变量的修改能被其他个基本概念,它规定了操作之间的偏序关系,在时间上的先后顺序,有助于理解并发程序线程看到它是实现同步的基础为Java并发编程提供了内存一致性的保证中的同步机制双重检查单例模式步骤11私有构造函数步骤22声明私有静态实例步骤33双重检查Instance是否为null步骤44如果为null,则初始化实例双重检查单例模式是一种优化过的单例模式实现方式它通过在创建实例之前进行双重检查,确保只有一个实例被创建,从而提高了性能和线程安全性这种方式在多线程环境下也能够确保只有一个实例被创建线程安全与锁优化线程安全锁优化确保多个线程同时访问共享资源通过合理使用锁机制来提高并发时不会出现数据竞争和状态不一性能,避免不必要的同步开销致的问题,是并发编程的关键锁粗化锁消除当虚拟机检测到一连串的对同一当虚拟机检测到不可能出现共享个锁的请求时,会自动把加锁范围数据竞争的场合时,会主动消除不扩大必要的锁与原子类CAS()CAS Compare-And-Swap一种乐观锁算法,通过比较当前值与预期值是否一致来判断是否可以更新目标值原子类Java提供的一系列原子操作类,如AtomicInteger、AtomicLong等,能保证多线程环境下的线程安全线程安全利用CAS和原子类可以在无锁的情况下实现线程安全,提高并发性能偏向锁偏向锁简介偏向锁工作机制偏向锁的撤销偏向锁是Java SE5引入的一种优化技术,为当一个线程访问同步块并获取锁时,会在对当有另一个线程尝试获取同一个锁时,偏向了提高同步性能而引入的一种锁它是一种象头和栈帧中存储锁偏向的线程ID,以后该锁就会被撤销,膨胀为轻量级锁偏向锁的轻量级的锁实现,在大多数情况下不需要额线程在进入和退出同步块时不需要进行CAS撤销需要进行一次CAS操作,所以它的撤销外的synchronized同步开销操作来加锁和解锁成本比加锁时低轻量级锁优化措施锁膨胀JVM为了提高锁的性能和可扩展性,JVM引入了轻量级锁这一优化措施如果在尝试获取轻量级锁的过程中竞争失败,锁就会膨胀为重量级轻量级锁利用CAS操作尝试获取锁,不会立即阻塞线程,从而降低锁这样可以保证线程安全,但会带来更高的同步开销获取锁的开销重量级锁基于系统调用高开销但可靠12重量级锁由操作系统原生的互重量级锁能够提供强大的线程斥量实现,需要进行用户态到内同步能力,适用于竞争激烈的场核态的切换,因此开销较大景,但需要付出更高的性能代价阻塞式等待内核调度开销34线程在获取重量级锁失败时会线程在阻塞等待时需要由内核被挂起,进入阻塞状态,等待锁进行上下文切换和调度,增加了被释放后再次参与竞争系统开销锁膨胀锁升级机制性能折损12在高并发场景下,一个线程获取锁膨胀带来的同步开销会显著轻量级锁失败后,会自动升级为降低系统性能,因此需要合理设重量级锁以确保线程安全计代码以减少锁升级的发生优化建议3可以将共享资源分段,减小锁的粒度,或使用无锁算法来避免锁膨胀问题锁消除优化字节码提升性能前提条件JVM会在编译时对代码进行锁消除优化锁消除可以显著提高并发程序的性能,锁消除需要JVM对代码进行深入分析才,识别不可能存在线程竞争的场景并删避免不必要的锁操作开销能识别出线程安全问题除锁的相关指令锁粗化锁粗化优化同步方法优化同步代码块针对一系列对同一锁进行加锁的小操作锁粗化可以优化频繁的同步方法调用,减少对于一些小的同步代码块,JVM会自动将其,JVM会自动将其合并为对同一个对象的一加锁操作,提高并发效率对于容易发生资合并为对同一对象的一次性加锁,避免不必次性加锁,减少因频繁的加解锁操作而产生源竞争的场景尤其适用要的加锁开销这种优化对于性能敏感的场的性能消耗景很有帮助总结与展望在详细介绍了JVM虚拟机的体系结构、类加载机制、内存管理子系统等核心技术之后,我们对JVM虚拟机的发展趋势和未来展望进行总结。
个人认证
优秀文档
获得点赞 0