ClientEncryption 不支持单例模式 |Java 11.0.10+9 Red Hat,间歇性地在 tcache 中检测到双重释放

问题描述

我在运行 12-13 小时后,运行 JVM 的 Azure pod 崩溃并出现以下错误

free(): 在 tcache 2 中检测到双空闲 Java 运行时环境检测到一个致命错误

SIGSEGV (0xb) 在 pc=0x00007f3e214fbd21,pid=1,tid=91

JRE 版本:OpenJDK 运行时环境 18.9 (11.0.10+9) (build 11.0.10+9-LTS) Java VM:OpenJDK 64-Bit Server VM 18.9(11.0.10+9-LTS,混合模式,共享,分层,压缩oops,g1 gc,linux-amd64) 有问题的框架: C [libc.so.6+0x21d21] abort+0x203

核心转储将被写入。认位置:核心转储可以用“/usr/share/apport/apport %p %s %c %d %P %E”处理(或转储到/home/jboss/core.1)

一个包含更多信息的错误报告文件保存为: /home/jboss/hs_err_pid1.log

如果您想提交错误报告,请访问: https://bugzilla.redhat.com/enter_bug.cgi?product=Red%20Hat%20Enterprise%20Linux%208&component=java-11-openjdk 崩溃发生在本地代码中的 Java 虚拟机之外。 请参阅有问题的框架以了解在哪里报告错误

JRE 构建版本为 11.0.10+9-LTS(OpenJDK Runtime Environment RedHat) OpenJDK 64 位服务器 VM 18.9(11.0.10+9-LTS,混合模式,共享,分层,压缩 oops,g1 gc,Linux-amd64 我正在使用带有弹簧数据 JPA 的弹簧靴,

每当我的应用程序打开与 mongo 的连接时,我都会从日志中观察到它在这个 JVM 崩溃上的位置。

var pig = {
  species: 'pig',name: 'bob',noises: ['oink','snort','fart','squeal']
}
//i function
//o adds new animal to animals array
//c takes 2 parameters,must check for unique name,name property >0,species property >0
//signature of 'function add(animals,animal) {'
function add(animals,animal) {
  for (var i = 0; i < animals.length; i++) {
    if ((animal.name.length > 0) && (animal.species.length > 0) && (animal.name !== animals[i].name)) {
      animals.push(animal);
    }
  }
}

// console.log(animals)

add(animals,pig)

在我的最后一条语句(即打开的连接)之后,我的应用程序登陆 JVM 崩溃。

现在我需要了解我使用的 java mongo 驱动程序是否有问题,一旦应用程序打开 mongo 连接,pod 就会重新启动并出现上述 JVM 错误 >

很难产生这个问题。 如果我们的应用程序在满负载的情况下运行正常,并且如果我们在 12 小时的理想时间后运行应用程序,我们就会遇到 JVM 崩溃。

解决方法

找到了解决方案。 这不是 JVM 的问题,而是 mongo-driver-sync 库的问题。 clientEncryption 对象的单例对象创建导致 JVM 在一定的理想时间后崩溃。

在我们的例子中,一旦我们启动了应用程序并进行了一些加密,它就可以正常工作,但是在一段时间后,如果我们保持应用程序理想状态,然后尝试使用相同的单例实例进行加密,那么 JVM 就会崩溃.

使用 clientEncryption 的新对象,它可以正常工作但是这个解决方案在加密和解密数据时在系统缓慢方面带来了更严重的问题。

为 Mongo Ticket 提了票 让我们看看他们会有什么解决方案