最近我们在生产环境中遇到了固定对象溢出错误,例如
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/