什么是固定对象溢出?

What is pinned object overflow?

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

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 个实例的数量。