追蹤應用程式使用直接位元組緩衝區

您可以使用追蹤機能來診斷記憶體用量過多的原因,或使用直接位元組緩衝區之應用程式的 OutOfMemoryError 異常狀況。

追蹤點可用來協助診斷與使用直接位元組緩衝區相關的記憶體問題。 追蹤點 ID 是 j9jcl.335 至 j9jcl.338,格式如下:
  • 追蹤點 j9jcl.335 會列印配置的記憶體數量: >sun_misc_Unsafe_allocateDBBMemory(0x%zx)
  • 無法配置記憶體時,追蹤點 j9jcl.336 會列印: <sun_misc_Unsafe_allocateDBBMemory -- OutOfMemory
  • 追蹤點 j9jcl.337 會列印已配置記憶體的位址: <sun_misc_Unsafe_allocateDBBMemory result = %p
  • 追蹤點 j9jcl.338 會列印所釋放記憶體的位址: >sun_misc_Unsafe_freeDBBMemory(%p)
附註: 追蹤點 ID 可能會變更,恕不另行通知。 若要取得可靠的結果,請參閱 J9 VM 參照中的 判斷追蹤點的追蹤點 ID

追蹤點 ID 可以與 -Xtrace 選項搭配使用,以追蹤元件內的問題。 -Xtrace 指令可以將輸出導向檔案或主控台,或導向內部緩衝區,當發生問題時,這些緩衝區會傾出至檔案。 有許多與追蹤機能相關聯的選項可用來診斷問題。 請參閱 J9 VM 參照中的 追蹤 Java 應用程式 一節。 如需設定 -Xtrace 選項的特定相關資訊,請參閱 J9 VM 參照中的 控制追蹤

例如,若要在呼叫追蹤點時產生主控台輸出,請使用下列指令:
-Xtrace:print=j9jcl.335-338
產生的輸出類似於:
17:41:05.420 0x61fa00           j9jcl.335      > sun_misc_Unsafe_allocateDBBMemory(0x21d8)
17:41:05.421 0x61fa00           j9jcl.337      < sun_misc_Unsafe_allocateDBBMemory result = 6B71CC10
17:41:05.428*0x6b926600           j9jcl.338      > sun_misc_Unsafe_freeDBBMemory(6B71CC10)
您也可以使用下列指令,在主控台輸出中包含堆疊追蹤:
-Xtrace:print=j9jcl.335-338,trigger=tpnid{j9jcl.335-338,jstacktrace}
以下範例包含由指令產生的堆疊追蹤輸出:
-Xtrace:print=j9jcl.335-338,trigger=tpnid{j9jcl.335,jstacktrace},trigger=tpnid{j9jcl.338,jstacktrace}
17:54:40.377 0x2dfd00           j9jcl.335      > sun_misc_Unsafe_allocateDBBMemory(0x21d8)
17:54:40.378 0x2dfd00       j9trc_aux.0        - jstacktrace:
17:54:40.379 0x2dfd00       j9trc_aux.1        - [1] sun.misc.Unsafe.allocateDBBMemory (Native Method)
17:54:40.380 0x2dfd00       j9trc_aux.1        - [2] java.nio.DirectByteBuffer.<init> (DirectByteBuffer.java:102)
17:54:40.381 0x2dfd00       j9trc_aux.1        - [3] java.nio.ByteBuffer.allocateDirect (ByteBuffer.java:288)
17:54:40.382 0x2dfd00       j9trc_aux.1        - [4] test.Test1a.allocatebuf (Test1a.java:10)
17:54:40.383 0x2dfd00       j9trc_aux.1        - [5] test.Test1a.main (Test1a.java:14)
17:54:40.383 0x2dfd00           j9jcl.337      < sun_misc_Unsafe_allocateDBBMemory result = 6B79D770
17:54:40.388*0x6ba02300           j9jcl.338      > sun_misc_Unsafe_freeDBBMemory(6B79D770)
17:54:40.389 0x6ba02300       j9trc_aux.0        - jstacktrace:
17:54:40.390 0x6ba02300       j9trc_aux.1        - [1] sun.misc.Unsafe.freeDBBMemory (Native Method)
17:54:40.391 0x6ba02300       j9trc_aux.1        - [2] java.nio.DirectByteBuffer$Deallocator.run (DirectByteBuffer.java:72)
17:54:40.392 0x6ba02300       j9trc_aux.1        - [3] sun.misc.Cleaner.clean (Cleaner.java:125)
17:54:40.393 0x6ba02300       j9trc_aux.1        - [4] java.lang.ref.ReferenceQueue.enqueue (ReferenceQueue.java:137)
17:54:40.393 0x6ba02300       j9trc_aux.1        - [5] java.lang.ref.Reference.enqueueImpl (Reference.java:74)