2014-03-07 24 views
5

我想了解JVM內部如何實現基本類型的數組,像int []JVM中如何實現Java int []數組?

我的問題是兩個部分:

1 - 是否使用字節緩衝區內?我在哪裏可以找到源代碼,然後可能根據我的需要進行更改(以創建我自己的修改的JVM)。

2 - 有沒有什麼辦法詭計javac不使用int []的內置實現,而是使用庫中提供的實現,比如說類路徑-cp?這是可能的和如何?

我的動機是將此int []聲明在JVM之外的內存中(使用allocateDirect()),並從本機JNI代碼以外訪問它。這應該避免內存複製開銷。

-B

回答

0
  1. INT []是原始類型。 ByteBuffer可能基於int [],但是相反肯定不是真的。它將幾乎完全成爲一個字對齊的連續內存塊,並在該塊的每個字中存儲32位值。幾個JVM是開源的,你可以看看代碼,如果你真的想,但它會是先進的東西。

  2. 有沒有簡單的方法來做到這一點。

這聽起來像你正在嘗試以一種非常複雜的方式做一些事情。描述你試圖解決的實際問題可能會更好,而不是問一個試圖解決這個問題的問題。

+0

我正在使用MPJ Express(Java中的MPI實現),它使用內部緩衝層來緩衝用戶數據。問題在於這種緩衝。在高端互連(Infiniband)上,將數據複製到內部緩衝層會顯着降低性能,即與本機C MPI實現(如MVAPICH或Open MPI)相比,帶寬相對較低。所以我想繞過這個緩衝層,直接訪問用戶數據而不改變API(用戶程序)。 – Bibrak

+0

@Bibrak你使用'System.arraycopy'來複制數據嗎? –

+0

@AlexeiKaigorodov但它沒有做一個副本?我想做一個Zero-Copy – Bibrak

0

您可以使用sun.misc.Unsafe來分配和訪問原始共享內存,而不是使用Java IntBuffer或JNI,而不是使用Java IntBuffer或JNI。這是危險的,但它是從Java和其他進程訪問共享內存的絕對最快的方式。

不安全方法的有用指南是here

+0

'sun.misc.Unsafe'確實給出了分配本地內存的選項,但問題仍然存在,因爲用戶數組(普通,普通,原始數組)不是本地隱式分配的。 – Bibrak

+0

對。這是Java數組的一種替代方法,可以更輕鬆地與其他進程互操作。儘管如果你可以做一些非常不安全的詭計來說服JVM使用標準語法可以作爲int []數組訪問,那麼我不會感到驚訝 - int []的內存頭文件非常簡單。嗯... – Bryce

+0

你的意思是有一個自定義的JVM? – Bibrak