Java 虚拟机 ( JVM )
JVM 是一种抽象计算机,它使计算机能够运行 Java 程序。JVM 有三个概念: 规范 (指定 JVM 的工作方式。但实现已由 Sun 等公司提供)、 实现 (称为 ( JRE ) Java 运行时环境)和 实例 (编写 Java 命令后,运行Java 类,一个 JVM 实例被创建)。
Java 虚拟机加载代码、验证代码、执行代码、管理内存(这包括从操作系统 (OS) 分配内存、管理 Java 分配,包括堆压缩和垃圾对象的删除)并最终提供运行时环境。
Java (JVM) 内存结构
JVM 定义了在程序执行期间使用的各种运行时数据区域。有些区域是由 JVM 创建的,而有些是由程序中使用的 线程 创建的。但是,JVM 创建的内存区域只有在 JVM 退出时才会被销毁。线程的数据区在实例化时创建,在线程退出时销毁。
堆
堆内存 是运行时数据区域,所有 java 类实例和数组的内存都从该区域分配。堆是在 Java 虚拟机启动时创建的,并且在应用程序运行时可能会增加或减少大小。可以使用 –Xms VM 选项指定堆的大小。根据垃圾收集策略,堆可以是固定大小或可变大小。可以使用 –Xmx 选项设置最大堆大小。默认情况下,最大堆大小设置为 64 MB。
堆内存被分为 年轻代 和 老年代 ,比例为 1:2
年轻代又被分为 伊甸区 和 两个幸存者区 ,比例默认为: 8:1:1
常用的一些JVM内存参数设置
JVM Switch | JVM Switch Description |
-Xms | 设置 JVM 启动时的初始堆大小 |
-Xmx | 设置最大堆大小 |
-Xmn | 设置年轻代的大小,其余空间用于老年代 |
-XX:PermGen | 设置永久代内存的初始大小 |
-XX:MaxPermGen | 设置 Perm Gen 的最大大小 |
-XX:SurvivorRatio | 提供 Eden 空间的比例,例如,如果年轻代大小为 10m, VM 切换为 –XX:SurvivorRatio=2,则将为 Eden 空间保留 5m,为两个 Survivor 空间保留 2.5m。默认值为 8 |
-XX:NewRatio | 年轻代和老年代的比例 |
堆是一个共享的运行时数据区,并将实际 对象存储 在内存中。它在虚拟机启动期间被实例化
方法区
- 它是堆区域的逻辑部分,在虚拟机启动时创建。
- 该内存分配给类结构、方法数据和构造函数字段数据,以及类中使用的接口或特殊方法。堆可以是固定大小或动态大小,具体取决于系统的配置。
- 可以是固定大小或根据计算需要扩展。不需要是连续的。
虽然方法区在逻辑上是堆的一部分,但它可能会或可能不会被垃圾收集,即使垃圾收集在堆区是强制性的。
JVM 栈
- 堆栈在创建线程的同时创建,用于存储方法返回值和执行动态链接时需要的数据和部分结果。
- 堆栈可以是固定大小或动态大小。堆栈的大小可以在创建时独立选择。
- 堆栈的内存不需要是连续的。
本地方法栈
本机方法堆栈不是用Java语言编写的。该内存是在创建时为每个线程分配的。它可以是固定的或动态的。
程序计数器 (PC寄存器)
每个执行特定方法任务的 JVM 线程都有一个与之关联的程序计数器寄存器。非本地方法具有存储可用 JVM 指令地址的 PC,而在本地方法中,程序计数器的值是未定义的。PC 寄存器能够在某些特定平台上存储返回地址或本机指针。