第一章 走进JVM的世界之 了解JVM基础
一、JVM是什么?
JVM是Java虚拟机(Java Virtual Machine)的缩写,它是Java语言的核心运行时环境之一。JVM是一种抽象的计算机,它能够将Java字节码翻译成底层操作系统能够识别的机器码,从而实现Java程序的跨平台运行。
JVM由三部分组成:类加载器、运行时数据区和执行引擎。其中,类加载器负责将Java字节码加载到内存中;运行时数据区包括方法区、堆、栈等,用于存储程序运行时的数据;执行引擎则负责执行Java字节码,并将其翻译成机器码。
JVM还提供了一些垃圾回收机制,可以自动管理内存,避免内存泄漏等问题。此外,JVM还支持多线程编程,可以提高程序的并发性能。
二、常见的JVM调优方法
JVM调优是指对Java虚拟机进行性能优化,以提高应用程序的运行效率和响应速度。以下是一些常见的JVM调优方法:
1.选择合适的垃圾回收器
不同的垃圾回收器有不同的优缺点,需要根据应用程序的特点选择合适的垃圾回收器。例如,如果应用程序需要低延迟,可以选择并行或CMS垃圾回收器;如果需要高吞吐量,可以选择G1垃圾回收器。
2.调整堆内存大小
堆内存的大小直接影响到应用程序的性能,需要根据应用程序的内存使用情况进行调整。可以通过增加或减少-Xms和-Xmx参数来调整堆内存大小。
3.调整新生代和老年代的比例
新生代和老年代的比例也会影响到垃圾回收的效率和频率。可以根据应用程序的特点进行调整,例如,如果应用程序有大量的短期对象,可以适当增加新生代的比例。
4.启用或禁用某些垃圾回收器参数
垃圾回收器的参数可以影响到垃圾回收的效率和频率,可以根据应用程序的特点启用或禁用某些参数。例如,可以启用-XX:+UseParallelGC参数来启用并行垃圾回收器。
5.使用线程池
线程池可以提高线程的利用率,减少线程创建和销毁的开销。可以使用Java提供的线程池API或者第三方库来实现线程池。
6.避免对象的频繁创建和销毁
对象的频繁创建和销毁会导致垃圾回收的频率增加,影响应用程序的性能。可以通过使用对象池或者缓存来避免对象的频繁创建和销毁。
三、JVM调优参数设置
1. 堆内存大小(-Xms和-Xmx)
堆内存是Java程序运行时占用的主要内存区域,可以通过调整这两个参数来优化堆内存的使用。
-Xms
:初始堆内存大小,单位为字节。默认值为128MB。-Xmx
:最大堆内存大小,单位为字节。默认值为1024MB。
2. 新生代与老年代比例(-XX:NewRatio)
新生代和老年代的比例会影响垃圾回收的效率。通过调整这个参数,可以平衡新生代和老年代的内存使用。
-XX:NewRatio
:新生代与老年代的比例,取值范围为1到1024。默认值为128。
标题3. 新生代大小(-XX:MaxNewSize)
新生代的大小会影响垃圾回收的效率。通过调整这个参数,可以控制新生代的内存使用。
-XX:MaxNewSize
:新生代的最大大小,单位为字节。默认值为64MB。
4. 永久代大小
永久代是Java虚拟机中用于存储类元数据的内存区域。通过调整这两个参数,可以优化永久代的使用。
-XX:PermSize
:永久代的初始大小,单位为字节。默认值为64MB。-XX:MaxPermSize
:永久代的最大大小,单位为字节。默认值为256MB。
5. 垃圾回收器
JVM垃圾回收器是Java虚拟机中用于自动管理内存的组件,它能够自动检测和清除不再使用的对象,以释放内存空间。JVM垃圾回收器主要有以下几种:
5.1. Serial收集器
单线程执行垃圾回收操作,适用于小型应用系统和客户端应用。
-XX:+UseSerialGC
:使用串行垃圾回收器。
5.2.Parallel收集器
多线程执行垃圾回收操作,适用于多核CPU的服务器端应用。
-XX:+UseParallelGC
:使用并行垃圾回收器。
5.3. CMS(Concurrent Mark Sweep)收集器
并发执行垃圾回收操作,适用于对响应时间要求较高的应用系统。
-XX:+UseConcMarkSweepGC
5.4. G1(Garbage-First)收集器
将堆划分为多个区域,并行执行垃圾回收操作,适用于大内存的应用系统。
-XX:+UseG1GC
5.5. ZGC(Z Garbage Collector)收集器
基于Region内存布局的低延迟垃圾回收器,适用于大内存、低延迟要求的应用系统。Z Garbage Collector是默认的垃圾回收器,除非你在启动参数中明确指定了其他垃圾回收器,否则它将自动被使用。
-XX:+UseZGC
5.6. Shenandoah收集器**
低延迟、吞吐量可伸缩的垃圾回收器,适用于大内存、高吞吐量要求的应用系统。
-XX:+UseShenandoahGC
6. 线程栈大小(-Xss)
线程栈大小影响线程的创建和执行效率。通过调整这个参数,可以优化线程栈的使用。
- -Xss:线程栈大小,单位为字节。默认值为1MB。
7. 其他调优参数
这是一组Java虚拟机(JVM)的启动参数,用于配置JVM的内存分配和垃圾回收策略。具体解释如下:
-Xmn512m
:设置新生代最小堆内存大小为512MB。-Xms1024m
:设置初始堆内存大小为2048MB。-Xmx2048m
:设置最大堆内存大小为2048MB。-Xmn1536m
:设置新生代最小堆内存大小为1536MB。-Xss256k
:设置线程栈大小为256KB。-XX:CICompilerCount=4
:设置编译器数量为4个。-XX:ParallelGCThreads=4
:设置并行垃圾回收器使用的线程数为4个。-XX:MetaspaceSize=256m
:设置元空间初始大小为256MB。-XX:MaxMetaspaceSize=256m
:设置元空间最大大小为256MB。-XX:CompressedClassSpaceSize=64m
:设置压缩类空间初始大小为64MB。-XX:+UseG1GC
:启用G1垃圾回收器。-XX:G1ConcRefinementThreads=2
:设置G1垃圾回收器的并发整理线程数为2个。-XX:NativeMemoryTracking=detail
:开启本地内存跟踪,显示详细的内存使用情况。-Dfile.encoding=UTF-8
:设置文件编码为UTF-8。
四.各个版本JDK中的使用的垃圾回收器
1. JDK 1.5及之前版本
使用Serial、Parallel和CMS垃圾收集器。
2. JDK 1.6
除了Serial、Parallel和CMS之外,还引入了G1垃圾收集器。
3. JDK 1.7
除了Serial、Parallel、CMS和G1之外,还引入了Concurrent Mark Sweep (CMS)垃圾收集器的并行版本。
4. JDK 1.8
除了Serial、Parallel、CMS、G1和并行CMS之外,还引入了默认的垃圾收集器为Parallel,并增加了新的Epsilon垃圾收集器。
5. JDK 9及以上版本
除了Serial、Parallel、CMS、G1、并行CMS和Epsilon之外,还引入了ZGC(低延迟垃圾收集器)和Shenandoah(低延迟高吞吐量垃圾收集器)。