JVM

虚拟机中的共划分为三个代:年轻代(Young Generation)、年老点(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。

年轻代:
    所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区。一个Eden区,两个Survivor区(一般而言)。大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当这个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当这个Survivor区也满了的时候,从第一个Survivor区复制过来的并且此时还存活的对象,将被复制“年老区(Tenured)”。需要注意,Survivor的两个区是对称的,没先后关系,所以同一个区中可能同时存在从Eden复制过来 对象,和从前一个Survivor复制过来的对象,而复制到年老区的只有从第一个Survivor去过来的对象。而且,Survivor区总有一个是空的。同时,根据程序需要,Survivor区是可以配置为多个的(多于两个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。

年老代:
    在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。

持久代:
    用于存放静态文件,如今Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。

什么情况下触发垃圾回收 
由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC和Full GC。
 
Scavenge GC
    一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。
 
Full GC
    对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:
· 年老代(Tenured)被写满
· 持久代(Perm)被写满 
· System.gc()被显示调用 
·上一次GC之后Heap的各域分配策略动态变化
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、付费专栏及课程。

余额充值