草庐IT

Java JIT 编译器导致 OutOfMemoryError

coder 2024-03-07 原文

我们最近启动的一个应用程序偶尔会崩溃,并显示有关“java.lang.OutOfMemoryError:为 Chunk::new 请求 8589934608 字节。交换空间不足?”的消息。

我在网上看了一圈,到处都是建议

  • 恢复到以前的 Java 版本
  • 摆弄内存设置
  • 使用客户端而不是服务器模式

恢复到以前的版本意味着新的 Java 有一个错误,但我还没有看到任何迹象。内 stub 本不是问题;服务器有 32GB 可用空间,Xmx 设置为 20,而 Xms 为 10。我看不到 JVM 用完了剩余的 12GB(减去机器上少数其他进程的数量)。由于应用程序和环境的性质,我们坚持使用服务器模式。

当我查看应用程序的内存和 CPU 使用情况时,我看到一整天的内存使用情况都在持续,但就在它消失之前突然 CPU 使用情况上升到 100%,内存使用情况从 X 到 X + 2GB,到 X + 4GB,到(有时)X + 8GB,到 JVM 死亡。似乎在 JIT 编译中可能存在重复调整数组大小的循环。

我现在已经看到上述 8GB 请求和 16GB 请求都发生了错误。在任何时候,发生这种情况时编译的方法都是相同的。它是一个简单的方法,没有嵌套循环,没有递归,并且在对象上使用方法直接返回静态成员字段或实例成员字段,计算量很小。

所以我有两个问题:

  1. 有人有什么建议吗?
  2. 我可以测试在测试环境中编译此特定方法是否存在问题,而不运行整个应用程序,直接调用 JIT 编译器吗?或者我应该启动应用程序并告诉它在调用次数少得多(比如 2)后编译方法,以强制它几乎立即编译方法,而不是在一天中的随机时间点编译方法?

@StephenC

JVM 是 1.6.0_20(以前是 1.6.0_0),在 Solaris 上运行。我知道是编译导致的问题有几个原因。

  1. ps 在它之前的几秒内显示一个 id 对应于编译器线程(来自 jstack)的 java 线程占用了 100% 的 CPU 时间
  2. jstack 显示问题出在 JavaThread "CompilerThread1"daemon [_thread_in_native, id=34, ...]

jstack中提到的方法总是同一个,而且是我们写的一个。如果您查看示例 jstack 输出,您就会明白我的意思,但出于显而易见的原因,我无法提供代码示例或文件名。我会说这是一个非常简单的方法。 Essential 少量空值检查,2 个用于执行相等性检查并可能分配值的循环,以及之后的一些简单方法调用。总共可能有 40 行代码。

这个问题在 2 周内发生了 2 次,尽管应用程序每天都在运行并且每天都会重新启动。此外,应用程序在任何时候都没有承受重负载。

最佳答案

您可以通过创建一个名为 .hotspot_compiler 的文件来排除特定方法被 JIT 处理并将其放入您的应用程序“工作目录”中。只需按以下格式在文件中添加一个条目:

exclude com/amir/SomeClass someMethod

编译器的控制台输出如下:

### Excluding compile:  com.amir.SomeClasst::someMethod

有关详细信息,请阅读 this .如果您不确定您的应用程序“工作目录”是什么,请使用

-XX:CompileCommandFile=/my/excludefile/location/.hotspot_compiler

在您的 Java 启动脚本或命令行中。

或者,如果您不确定它是 JIT 编译器的错误,并且想看看您是否可以在没有任何 JIT 的情况下重现该问题,请使用 -Xint 运行您的 Java 进程。 .

关于Java JIT 编译器导致 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3455381/

有关Java JIT 编译器导致 OutOfMemoryError的更多相关文章

  1. ruby - Sinatra set cache_control to static files in public folder编译错误 - 2

    我不知道为什么,但是当我设置这个设置时它无法编译设置:static_cache_control,[:public,:max_age=>300]这是我得到的syntaxerror,unexpectedtASSOC,expecting']'(SyntaxError)set:static_cache_control,[:public,:max_age=>300]^我只想将“过期”header设置为css、javaascript和图像文件。谢谢。 最佳答案 我猜您使用的是Ruby1.8.7。Sinatra文档中显示的语法似乎是在Ruby1.

  2. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  3. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

  4. ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called” - 2

    我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是

  5. .net - 是否有 Ruby .NET 编译器? - 2

    是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/

  6. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

  7. ruby-on-rails - 什么会导致与 APNS 的连接间歇性断开连接? - 2

    我有一个ruby​​脚本可以打开与Apple推送服务器的连接并发送所有待处理的通知。我看不出任何原因,但当Apple断开我的脚本时,我遇到了管道损坏错误。我已经编写了我的脚本来适应这种情况,但我宁愿只是找出它发生的原因,这样我就可以在第一时间避免它。它不会始终根据特定通知断开连接。它不会以特定的字节传输大小断开连接。一切似乎都是零星的。您可以在单个连接上发送的数据传输或有效负载计数是否有某些限制?看到人们的解决方案始终保持一个连接打开,我认为这不是问题所在。我看到连接在3次通知后断开,我看到它在14次通知后断开。我从未见过它能超过14点。有没有人遇到过这种类型的问题?如何处理?

  8. python - 使用 Python、Ruby 和 Perl 重新编译 MacPort 版本的 MacVim - 2

    关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭10年前。ImprovethisquestionLinux专家正在转向Mac(10.8)。因为我懒...我使用MacPorts安装MacVim。它似乎安装没有错误。我只需要mvim中的python、ruby和perl支持。$/opt/local/bin/mvim--version|egrep'patches|python|ruby|perl'Includedpatches:1-244,246-646+multi_lang-mzscheme+

  9. ruby - 为什么 `middleman serve` 有效,但是 `middleman build` 编译这个 Sass 失败? - 2

    当我刚刚运行middleman时服务,all.css编译得很好,只包含对+box-shadow(none)的调用:/*line1,/home/yang/asdf/source/stylesheets/content.css.sass*/div{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}但是当我构建网站时,我得到了这个Sass/Compass错误:$middlemanbuildSlim::EmbeddedEngineisdeprecated,itiscalledSlim::EmbeddedinSlim2.0

  10. ruby - 在多个线程中引用类方法会导致自动加载循环依赖崩溃 - 2

    代码:threads=[]Thread.abort_on_exception=truebegin#throwexceptionsinthreadssowecanseethemthreadseputs"EXCEPTION:#{e.inspect}"puts"MESSAGE:#{e.message}"end崩溃:.rvm/gems/ruby-2.1.3@req/gems/activesupport-4.1.5/lib/active_support/dependencies.rb:478:inload_missing_constant':自动加载常量MyClass时检测到循环依赖稍加研究后,

随机推荐