2016-11-30 6 views
0

私は、オフヒープから大量のメモリに対して関数unsafe.allocateMemoryを呼び出していました。しかし、返される値は奇数です。unsafe.allocateMemoryがJavaで返すもの

ランタイム環境は、ここで示しています ここ

が私のコードです:

import java.lang.reflect.Field; 
import sun.misc.Unsafe; 
public class UnsafeTest{ 
    public static void main(String[] args){ 
      try{ 
      Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); 
      theUnsafe.setAccessible(true); 
      Unsafe unsafe = (Unsafe) theUnsafe.get(null); 
      long addr = unsafe.allocateMemory(16); 
      System.out.println("the address is :"+addr); 
      unsafe.freeMemory(addr); 
      }catch(Exception e){ 
        System.out.println(e.getMessage()); 
      } 
    } 
} 

結果:結果値はそんなにあるので

私は、何かが間違っていると思いました総メモリサイズ(約6G)よりも大きい。値がメモリアドレスだったのだろうか?もしそうなら、どのように実際にあまりメモリがないので、それを割り振ることができますか?そうでない場合は、OSのメモリ/ヒープのベースアドレスを指定します。

+0

http://hg.openjdk.java @ .net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/misc/Unsafe.java#l466 –

+2

Unsafeの使用は高度な低レベルプログラミングのためのものです。私はあなたがその資格を持たないことをお勧めします。 – DwB

+0

https://en.wikipedia.org/wiki/X86-64#Virtual_address_space_details –

答えて

1

Unsafe#allocateMemory戻り、本質的にJVMプロセスに関連付けられている仮想メモリ空間内のアドレスである"native pointer"と呼ばれるものを。オペレーティングシステムとCPUに組み込まれたMemory Management Unitは、この仮想空間内のアドレスを実際の物理メモリ内のアドレスにマッピングする役割を担います。

アドレス空間は仮想であるため、その中の数値は、物理メモリがシステムで使用できる量とは何の関係もありません。VMレイアウトとメモリ割り当て関数から返されるアドレスは、オペレーティングシステムの裁量でJavaが依存するコアライブラリです。 OSは仮想アドレス空間にhardware limitationsを課す必要があります。

も参照してください:

クレジット:@ソティリオス・delimanolisが残しコメントとklitos-kyriacou

+0

ありがとう、@ anttix。あなたの答えは本当に私を助けました。私は、仮想メモリを物理メモリと混在させました。しかし、混乱しているものがまだあります。圧縮されたOopsを有効にすると、通常はメモリがバイトではなくWord(64ビット)でアドレスされ、右の3ビットをシフトすることにより、ネイティブ仮想メモリアドレスを持つ圧縮アドレス(32ビット)を作成します。[link]から見ることができます(http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/ 9b0ca45cd756/src/share/vm/oops/oop.inline.hpp)しかし、私の場合、3ビットをshiffedした後、値は2^32よりも大きくなります。 –

+0

私は圧縮されたおっとのあなたの理解は少し不完全だと思います。 Oracleからの引用は次のとおりです。「Compressed oopsは、マネージド・ポインタを64ビットJavaヒープ・ベース・アドレスからの32ビット・オブジェクト・オフセットとして表します。 圧縮されたoopsを32ビットに収めるのはその基本値(64ビットアドレス)の省略です 参照:http://stackoverflow.com/questions/25120546/trick-behind-jvms-compressed-oops – anttix

関連する問題