Java 什么是固定对象溢出?

Java 什么是固定对象溢出?,java,jvm,Java,Jvm,最近,我们在生产环境中遇到了固定对象溢出错误,例如 Caused by: java.lang.InternalError: pinned object overflow! 你能解释一下吗 1) 什么是固定对象 2) JVM是在内部完成的,还是也可以通过编程完成 3) 可能发生固定对象溢出的情况?好的,我们假设您正在使用JRockit 1) 什么是固定对象 固定对象是不允许移动的对象。通常,如果对象正在升级或作为压缩的一部分,则对象可能会从一个地址移动到另一个地址。但是如果一个对象被固定,GC将

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

Caused by: java.lang.InternalError: pinned object overflow!
你能解释一下吗

1) 什么是固定对象

2) JVM是在内部完成的,还是也可以通过编程完成


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

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

1) 什么是固定对象

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

2) JVM是在内部完成的还是也可以通过编程完成的

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

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

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


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

你是说JRockit吗?请提供环境详细信息。使用weblogic、jdk 6。请提供完整的堆栈跟踪。您是否尝试使用JRockit任务控制?内存转储下要查看的参数是什么?如果jrockit在调用
InputStream或OutputStream
上的任何方法时在内部执行此操作,程序员如何避免此操作?程序员无法避免此操作。检查I/O中阻塞了多少线程,并尝试在转储中查找字节数组或*流实例。还提供异常的堆栈跟踪。