java - 什么是固定对象溢出?

标签 java jvm

最近我们在生产环境中遇到了固定对象溢出错误,例如

Caused by: java.lang.InternalError: pinned object overflow!

请解释一下

1) 什么是固定对象?

2) JVM 是在内部执行此操作还是也可以通过编程方式执行此操作?

3) 固定对象溢出可能发生的情况?

最佳答案

好的,我们假设您正在使用 JRockit。

1)what is pinning object ?

固定的对象是不允许移动的对象。通常,如果正在升级或作为压缩的一部分,对象可能会从一个地址移动到另一个地址。但如果一个对象被固定,GC 不会尝试移动它,直到它被取消固定。这基本上意味着某人有一个指向对象内存地址的指针,并且 JVM 必须将该对象保留在适当的位置。

2)Does JVM do it internally or it can be done programmatically also ?

据我所知,这只能通过编程来完成。例如,下面的JNI方法允许直接访问JVM持有的数据 (*env)->GetPrimitiveArrayCritical()

此外,JRockit 还具有性能优化 - 在 I/O 操作期间固定缓冲区,从而允许将其地址直接传递给操作系统。通过调用 *InputStream*OutputStream 中的任何方法隐式使用此优化(参见详细信息 here )。

3)possible cases when pinned objectoverflow can happen ?

有很多情况 - JNI 调用中的问题、I/O 调用中的错误异常处理。为了更精确,我们必须有堆转储或分析结果(JRockit Mission Control)。我们首先要查看的是 I/O 中阻塞的堆栈数量或 *InputStream 实例的数量。

关于java - 什么是固定对象溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33759461/

相关文章:

java - 使用 Maven Ant 任务执行 jetty stop 时未授予权限 (java.lang.RuntimePermission exitVM)

java - 无法通过 placeholder.com url 加载图像

java - 从同一列表中单独分配选择选项值和描述

java - Spring Integration Java DSL 单元测试 - 如何模拟服务激活器类或其他组件/端点?

multithreading - 阻塞I/O与非阻塞I/O之间是否存在灰色区?

java - 如何在 Android 上使用 swi-prolog

java - openjdk : How to avoid fully recompilation of jdk after I modify jdk's code?

java - 双重计算产生奇怪的结果

java - 从 Spring Boot 应用程序获取 pod 名称和 ip

java - 已接受 XX :UseSSE values for Java JVM?