JVM Code Cache代码缓存简介

JVM的CodeCache是存储编译成本机代码的区域,主要由JIT编译器使用。当其满时,会导致性能下降。通过调整如`ReservedCodeCacheSize`等选项和启用`UseCodeCache`刷新,可以优化和监控CodeCache的使用。从Java 9开始,CodeCache分为三个段以提高性能。监控CodeCache使用情况有助于识别和解决问题。

在本文中,我们将了解JVM的Code Cache 代码缓存。

什么是Code Cache?

简而言之,JVM Code Cache (代码缓存)是JVM存储编译成本机代码的字节码的区域。我们将可执行本机代码的每个块称为 nmethod 。 nmethod 可能是一个完整的或内联的Java方法。

即时( JIT )编译器是代码缓存区的最大消费者。这就是为什么一些开发人员将此内存称为JIT代码缓存。

Code Cache优化

代码缓存的大小是固定的。一旦它满了,JVM就不会编译任何额外的代码,因为JIT编译器现在处于关闭状态。此外,我们将收到“ CodeCache is full… The compiler has been disabled ”警告消息。因此,我们的应用程序的性能最终会下降。为了避免这种情况,我们可以使用以下大小选项调整代码缓存:

  • InitialCodeCacheSize –初始代码缓存大小,默认为160K
  • ReservedCodeCacheSize –默认最大大小为48MB
  • CodeCacheExpansionSize –代码缓存的扩展大小,32KB或64KB

增加ReservedCodeCacheSize可能是一个解决方案,但这通常只是一个临时解决办法。

幸运的是,JVM提供了一个 UseCodeCache 刷新选项来控制代码缓存区域的刷新。其默认值为false。当我们启用它时,它会在满足以下条件时释放占用的区域:

  • 代码缓存已满;如果该区域的大小超过某个阈值,则会刷新该区域
  • 自上次清理以来已过了特定的时间间隔
  • 预编译代码不够热。对于每个编译的方法,JVM都会跟踪一个特殊的热度计数器。如果此计数器的值小于计算的阈值,JVM将释放这段预编译代码

Code Cache使用

为了监控Code Cache(代码缓存)的使用情况,我们需要跟踪当前正在使用的内存的大小。

要获取有关代码缓存使用情况的信息,我们可以指定 –XX:+PrintCodeCache JVM选项。运行应用程序后,我们将看到类似的输出:

CodeCache: size=32768Kb used=542Kb max_used=542Kb free=32226Kb

让我们看看这些值的含义:

  • 输出中的大小显示内存的最大大小,与 ReservedCodeCacheSize 相同
  • used 是当前正在使用的内存的实际大小
  • max_used 是已使用的最大尺寸
  • free 是尚未占用的剩余内存

PrintCodeCache选项非常有用,因为我们可以:

  • 看看什么时候会flushing
  • 确定我们是否达到了关键内存使用点

分段代码缓存

从Java9开始,JVM将代码缓存分为三个不同的段,每个段都包含特定类型的编译代码。更具体地说,有三个部分:

-XX:nonNMethoddeHeapSize
-XX:ProfiledCodeHeapSize
-XX:nonprofiedCodeHeapSize

这种新结构以不同的方式处理各种类型的编译代码,从而提高了整体性能。

例如,将短命编译代码与长寿命代码分离可以提高方法清理器的性能——主要是因为它需要扫描更小的内存区域。

小结

本文简要介绍了JVM Code Cache (代码缓存)。

此外,我们还提供了一些使用和调整选项来监视和诊断该内存区域。

### 如何清理或删除C盘中的Java Code Cache以释放空间 Java Code CacheJava 虚拟机(JVM)的一部分,用于存储 JIT(Just-In-Time)编译器生成的热点代码。这些编译后的代码可以提高程序性能,但它们会占用一定的磁盘空间。如果需要清理或删除 Code Cache 以释放 C 盘空间,可以通过以下方法实现: #### 1. 删除临时文件夹中的 Java 缓存 JavaCode Cache 和其他缓存文件通常存储在用户目录下的临时文件夹中。可以通过清理以下路径来释放空间: - `C:\Users\<用户名>\AppData\Local\Temp` - `C:\Users\<用户名>\.cache` - `C:\Users\<用户名>\.java` 在这些路径中查找与 JavaJVM 相关的文件夹,并删除不必要的缓存文件[^3]。 #### 2. 修改 JVM 参数以限制 Code Cache 大小 如果希望减少 Code Cache 的占用空间,可以在启动 Java 程序时通过设置 JVM 参数来限制其大小。例如,在启动 Java 应用程序时添加以下参数: ```bash -XX:InitialCodeCacheSize=8m -XX:ReservedCodeCacheSize=64m ``` 这将限制 Code Cache 的初始大小为 8MB,最大大小为 64MB。可以根据实际需求调整这些值。 #### 3. 卸载并重新安装 JDK 或 JRE 如果 Code Cache 占用了过多空间且无法通过清理解决,可以考虑卸载当前的 JDK 或 JRE 并重新安装。在重新安装时,可以选择将安装路径和缓存路径迁移到非 C 盘的位置,例如: - 安装路径:`D:\libpath\Java\jdk` - 缓存路径:`D:\libpath\Java\.cache`[^2] #### 4. 使用系统工具清理 Code Cache 可以通过 PowerShell 脚本快速定位大文件并删除无用的 Code Cache 文件。以下是一个示例脚本: ```powershell # 快速定位大于 1GB 的文件(管理员模式运行) Get-ChildItem -Path C:\ -Recurse -ErrorAction SilentlyContinue | Where-Object { $_.Length -gt 1GB } | Sort-Object -Property Length -Descending | Select-Object FullName, @{Name="Size(GB)";Expression={[math]::Round($_.Length /1GB, 2)}} ``` 运行此脚本后,检查输出结果中是否存在与 Java Code Cache 相关的大文件,并手动删除这些文件[^4]。 #### 5. 使用第三方工具清理磁盘空间 可以使用一些专业的磁盘清理工具来扫描和删除 Java Code Cache 及其他隐藏垃圾文件。推荐以下工具: - **TreeSize**:可视化分析磁盘空间使用情况。 - **WizTree**:快速扫描全盘文件并定位大文件。 - **BleachBit**:支持清理开发工具(如 Eclipse/IntelliJ)的残留文件和缓存[^4]。 ### 注意事项 - 在删除任何文件之前,请确保备份重要数据。 - 如果不确定某个文件是否可以删除,建议先查阅相关文档或咨询专业人士。 - 对于正在运行的 Java 应用程序,直接删除 Code Cache 文件可能会导致程序异常,因此建议在应用程序关闭后再进行清理。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值