JVM 与大型内存对象相关的问题

2024-01-26

我有一个二进制文件,其中包含一个短字符串列表,该列表在启动时加载并作为从字符串到 protobuf (包含字符串..)的映射存储在内存中。 (不理想,但由于遗留问题很难改变设计) 最近,该列表已从约 2M 条目增长到约 20M 条目,导致构建地图时失败。

首先我得到了OutOfMemoryError: Java heap space.

当我使用 xms 和 xmx 增加堆大小时,我们遇到了GC overhead limit exceeded.

在具有 15GB 可用内存和以下 JVM 参数的 Linux 64 位机器上运行(我增加了 RAM 10G->15G 和堆标志 6000M -> 9000M):

-Xms9000M -Xmx9000M -XX:PermSize=512m -XX:MaxPermSize=2018m

这个二进制文件做了很多事情并且正在服务实时流量,所以我不能承受它偶尔被卡住的情况。

编辑:我最终做了一件显而易见的事情,即修复代码(从 HashMap 更改为 ImmutableSet)并添加更多 RAM (-Xmx11000M)。


如果可能的话,我正在寻找一种临时解决方案,直到我们有一个更具可扩展性的解决方案。

首先,您需要弄清楚“OOME:超出GC开销限制”是否是由于堆引起的:

  • 太小...导致 JVM 执行重复的 Full GC,或者

  • 太大...导致 JVM 在运行 Full GC 时破坏虚拟内存。

您应该能够通过打开和检查 GC 日志并使用操作系统级别的监视工具检查是否存在过多的分页负载来区分这两种情况。 (在检查分页级别时,还要检查问题是否不是由于 JVM 与其他内存消耗大的应用程序之间的 RAM 竞争造成的。)

如果堆太小,请尝试将其增大。如果太大,请将其缩小。如果您的系统同时出现这两种症状……那么您就有大问题了。

您还应该检查 JVM 是否启用了“压缩 oops”,因为这将减少 JVM 的内存占用。这-XshowSettings选项列出了 JVM 启动时生效的设置。使用-XX:+UseCompressedOops如果压缩 oops 被禁用,则启用它们。

(您可能会发现默认情况下启用压缩 oops,但值得检查。这将是一个简单的修复...)

如果上述方法都不起作用,那么唯一的快速解决办法就是获得更多内存。


但显然,真正的解决方案是重新设计代码,这样您就不需要巨大的(并且随着时间的推移而增加)内存数据结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM 与大型内存对象相关的问题 的相关文章

随机推荐

  • 设置集成测试环境

    我想在我的集成测试中使用设置环境WebApplicationFactory 默认情况下 env 设置为Development 我的网络应用程序工厂的代码如下所示 public class CustomWebApplicationFactor
  • asio:如何将对象从一个io上下文传递到另一个io上下文

    我试图更好地理解 async asio 的工作原理 我有以下代码 我在套接字上调用 async read 来读取接下来的 10 个字节的数据 struct SocketReader void do read body asio async
  • 如何将总计行添加到Excel Power查询?

    我通过使用 excel power query 中的 group 函数生成了如下所示的表格 score 1 score 2 score 3 A 6 25 50 B 8 30 20 C 15 15 30 D 20 0 10 我想添加一个总计行
  • 批处理文件将多个目录中具有特定扩展名的文件复制到一个目录中

    我是新手 所以请耐心等待 我正在尝试复制所有 doc我使用批处理文件将一个主目录的多个子目录中的文件分散到另一个目录中 我已经设法得到了filelist txt我想使用以下方法复制这些目录中的所有文件 有数百个 C Main directo
  • 使用 Ruby/Rails 将链接从字符串转换为可点击链接

    使用 Ruby Rails 有谁知道如何获取可能包含一些 HTML 元素的大字符串并将它们放入链接中 这是一个例子 Check out my video on you tube http youtu be OkCcD6cOKgs 我正在寻找
  • 如何显示 MySQL 数据库中表的架构?

    来自MySQL https www mysql com 控制台 什么命令显示任何给定表的架构 对于格式化输出 describe db name table name 对于可用于创建表的 SQL 语句 show create table db
  • 如何通过拦截器向AngularJS中的http请求添加新的标头?

    var module angular module timestamp marker example module factory timestampMarker function var timestampMarker request f
  • Web 服务与 DLL;优点和缺点?

    我正在为我们的网站实施一项网络服务 该服务通过互联网请求并接收来自第三方的数据 我还被要求创建一个 DLL 为内部 Windows 应用程序复制 Web 服务的功能 我的问题是 不创建 DLL 并使用 WEB 服务用于内部和 Web 应用程
  • 在 post_save 信号中访问用户的请求

    我在我的项目中完成了以下 post save 信号 from django db models signals import post save from django contrib auth models import User COR
  • 如何使 UILabel 中的文本缩小字体大小

    如果 UILabel 包含太多文本 如何设置标签以缩小字体大小 这是我设置 UILabel 的方法 descriptionLabel UILabel alloc initWithFrame CGRectMake 200 30 130 150
  • 接口变量是否具有值类型或引用类型语义?

    接口变量是否具有值类型或引用类型语义 接口由类型实现 这些类型要么是值类型 要么是引用类型 显然 两者int and string实施IComparable and int是一个值类型 并且string是一个引用类型 但是这个呢 IComp
  • 如何使用 javascript 更新 parse.com 中的当前对象?

    我想用 javascript 更新 parse com 中已有的对象 我所做的是我首先通过查询退休了该对象 但我不知道如何更新它 这是我使用的代码 有什么问题吗 var GameScore Parse Object extend Drive
  • 通过 Jenkins REST API 获取 IP 地址?

    我的任务是对 Jenkins 的一些工作进行一些健康检查 这个想法是通过 Jenkins Rest API 获取作业的状态和关联的 IP 地址 这样我就可以使用该信息与另一个 Restful API 进行交互 我创建了一个 groovy 脚
  • 如何禁用所有打字稿类型检查?

    我想使用 TypeScript将来 但目前 我选择在 Create React App 中安装 TypeScript 稍后我会回去添加类型 因此 我想禁用所有类型检查 现在 当我做这样的事情时
  • 定时器 C#.开始、停止和获取调用之间的时间量[重复]

    这个问题在这里已经有答案了 可能的重复 如何测量函数运行了多长时间 https stackoverflow com questions 10107140 how to measure how long is a function runni
  • 使用枚举实现单例(Java 中)

    我读到可以实施Singleton在Java中使用Enum例如 public enum MySingleton INSTANCE 但是 上面的方法是如何工作的呢 具体来说 一个Object必须被实例化 这里 怎么样MySingleton被实例
  • ServerSocket - 真的有必要 close() 它吗?

    我有这个该死的结构 public void run try if portField getText equals String p portField getText CharSequence numbers 0123456789 btn
  • nexttick 和 onupdated 有什么区别?

    我正在关注某人的教程来学习如何nexttick有效 但我无法理解它和onUpdated 如下所示 引用部分几乎会出于相同的原因出现或被调用 为了进一步理解它 我创建了下面发布的代码 并如图所示nexttick之后被调用onUpdated 你
  • 使用 NodeJS 在 MySQL 中运行 SQL 文件

    我正在使用mysql https github com felixge node mysqlNodejs 的插件 它非常适合做我到目前为止需要的一切 然而我遇到了一个绊脚石 我创建了一个导出 mysql 池的 MySQL 提供程序 var
  • JVM 与大型内存对象相关的问题

    我有一个二进制文件 其中包含一个短字符串列表 该列表在启动时加载并作为从字符串到 protobuf 包含字符串 的映射存储在内存中 不理想 但由于遗留问题很难改变设计 最近 该列表已从约 2M 条目增长到约 20M 条目 导致构建地图时失败