最近我们在生产环境中遇到了固定对象溢出错误,例如
Caused by: java.lang.InternalError: pinned object overflow!
请你解释一下
1)什么是固定对象?
2)JVM是在内部执行还是以编程方式完成?
3)固定对象溢出可能发生的可能情况?
答案 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
个实例的数量。