什么是固定对象溢出?

时间:2015-11-17 14:29:50

标签: java jvm

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

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

请你解释一下

1)什么是固定对象?

2)JVM是在内部执行还是以编程方式完成?

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

1 个答案:

答案 0 :(得分:1)

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

  

1)什么是钉住对象?

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

  

2)JVM是在内部执行还是以编程方式完成?

据我所知,它只能以编程方式完成。例如,以下JNI方法允许直接访问JVM保存的数据 (*env)->GetPrimitiveArrayCritical()

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

  

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

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