JVM

本文深入探讨了JVM中的四种主要垃圾回收器:串行、并行、并发标记扫描和G1垃圾回收器。详细介绍了每种回收器的特点、适用场景及如何通过JVM参数进行选择。

JVM主流的架构分别是HotSpot(Sun JVM)和JRockit

1.Java有四种类型的垃圾回收器:

  1. 串行垃圾回收器(Serial Garbage Collector)

  2. 并行垃圾回收器(Parallel Garbage Collector)

  3. 并发标记扫描垃圾回收器(CMS Garbage Collector)

  4. G1垃圾回收器(G1 Garbage Collector)

JVM选择垃圾回收器类型:通过向JVM传递参数进行选择。

1、串行垃圾回收器(Serial Garbage Collector)

串行垃圾回收器通过持有应用程序所有的线程进行工作。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,通过冻结所有应用程序线程进行工作,所以可能不适合服务器环境。它最适合的是简单的命令行程序。

通过JVM参数-XX:+UseSerialGC可以使用串行垃圾回收器。

2、并行垃圾回收器(Parallel Garbage Collector)

并行垃圾回收器也叫做 throughput collector 。它是JVM的默认垃圾回收器。与串行垃圾回收器不同,它使用多线程进行垃圾回收。相似的是,它也会冻结所有的应用程序线程当执行垃圾回收的时候

3. 并发标记扫描垃圾回收器(CMS Garbage Collector)

并发标记垃圾回收使用多线程扫描堆内存,标记需要清理的实例并且清理被标记过的实例。并发标记垃圾回收器只会在下面两种情况持有应用程序所有线程。

  1. 当标记的引用对象在tenured区域;

  2. 在进行垃圾回收的时候,堆内存的数据被并发的改变。

相比并行垃圾回收器,并发标记扫描垃圾回收器使用更多的CPU来确保程序的吞吐量。如果我们可以为了更好的程序性能分配更多的CPU,那么并发标记上扫描垃圾回收器是更好的选择相比并发垃圾回收器。

通过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾回收器。

4、G1垃圾回收器

G1垃圾回收器适用于堆内存很大的情况,他将堆内存分割成不同的区域,并且并发的对其进行垃圾回收。G1也可以在回收内存之后对剩余的堆内存空间进行压缩。并发扫描标记垃圾回收器在STW情况下压缩内存。G1垃圾回收会优先选择第一块垃圾最多的区域

通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器

 

运行的垃圾回收器类型

配置描述
-XX:+UseSerialGC串行垃圾回收器
-XX:+UseParallelGC并行垃圾回收器
-XX:+UseConcMarkSweepGC并发标记扫描垃圾回收器
-XX:ParallelCMSThreads=并发标记扫描垃圾回收器 =为使用的线程数量
-XX:+UseG1GCG1垃圾回收器

GC的优化配置

配置描述
-Xms初始化堆内存大小
-Xmx堆内存最大值
-Xmn新生代大小
-XX:PermSize初始化永久代大小
-XX:MaxPermSize永久代最大容量
06-11
### 什么是 JVMJava 虚拟机(JVM)是 Java 运行时环境的核心组件,它负责运行 Java 程序[^2]。JVM 是一个抽象的计算机,它通过调用某个初始类的 `main()` 方法来运行 Java 程序[^3]。该方法必须满足以下条件:共有的(`public`)、静态的(`static`)、返回值为 `void`,并且接受一个字符串数组作为参数。 ### JVM 的组成 JVM 主要由以下几个部分组成: 1. **类加载器(Class Loader)** 类加载器负责将 `.class` 文件加载到内存中,并将其转换为可执行的字节码。类加载器分为引导类加载器、扩展类加载器和应用程序类加载器[^2]。 2. **运行时数据区(Runtime Data Areas)** JVM 在运行时会创建多个内存区域来存储数据,包括: - **方法区(Method Area)**:存储已被虚拟机加载的类信息、常量、静态变量等。 - **堆(Heap)**:所有对象实例以及数组都在堆上分配。 - **虚拟机栈(Java Virtual Machine Stacks)**:每个线程都有一个私有的虚拟机栈,存储局部变量表、操作数栈等。 - **本地方法栈(Native Method Stacks)**:与虚拟机栈类似,但服务于本地方法。 - **程序计数器(Program Counter Register)**:记录当前线程所执行的字节码指令地址。 3. **执行引擎(Execution Engine)** 执行引擎负责解释或编译字节码并执行。主要包括: - **解释器(Interpreter)**:逐条解释执行字节码。 - **即时编译器(JIT Compiler)**:将热点代码编译为本地机器码以提高性能[^4]。 4. **本地接口(Native Interface)** JVM 提供了与本地库交互的能力,例如通过 JNI(Java Native Interface)调用 C/C++ 编写的本地代码。 5. **垃圾回收机制(Garbage Collection, GC)** JVM 自动管理内存,通过垃圾回收器释放不再使用的对象占用的内存[^2]。 ### JVM 参数与优化 为了更好地控制 JVM 的行为,开发者可以使用各种 JVM 参数进行调优。这些参数涵盖了内存分配、垃圾回收策略、线程管理等多个方面[^1]。例如: - `-Xms` 和 `-Xmx`:设置堆内存的初始大小和最大大小。 - `-XX:+UseG1GC`:指定使用 G1 垃圾回收器。 - `-verbose:gc`:输出垃圾回收的日志信息。 ### 示例代码:启动 JVM 并运行 Java 程序 以下是一个简单的 Java 程序示例,展示了如何定义一个符合 JVM 规范的入口点: ```java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } } ``` 编译并运行该程序时,JVM 会加载 `HelloWorld` 类,并调用其 `main()` 方法作为程序的起点。 ### 同步与锁机制 在多线程环境中,JVM 提供了同步机制以确保线程安全。`synchronized` 关键字可以通过 ACC_SYNCHRONIZED 标志实现方法级别的同步,而无需显式调用 `monitorenter` 和 `monitorexit` 指令[^5]。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值