2016-11-30 4 views
0

메모리의 대부분이 off-heap 인 경우 "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)보다 큽니다. 값이 메모리 주소인지 궁금합니다. 그렇다면 어떻게 실제로 메모리가 그렇게 많지 않으므로 할당 할 수 있습니까? 그렇지 않은 경우 운영 체제의 메모리/힙의 기본 주소는 무엇입니까?

+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"native pointer"이라는 내용을 반환합니다.이 내용은 기본적으로 가상 메모리의 주소이며 JVM 프로세스와 연관되어 있습니다. 운영 체제와 CPU에 내장 된 Memory Management Unit은이 가상 공간의 주소를 실제 실제 메모리의 주소에 매핑하는 역할을합니다.

주소 공간이 가상이기 때문에 숫자 값은 시스템에서 사용할 수있는 실제 메모리의 양과 아무 관련이 없습니다. VM 레이아웃 및 메모리 할당 기능에서 반환 된 주소는 운영 체제의 재량에 달려 있습니다. 자바가 의존하는 핵심 라이브러리. OS는 가상 주소 공간에 hardware limitations을 부과해야합니다.

은 참조 :

크레딧 : @ 남긴 댓글을 소티 리오스 - delimanolis와 @ klitos - kyriacou

+0

감사합니다. @ anttix. 귀하의 답변에 정말 도움이되었습니다. 가상 메모리를 실제 메모리와 섞었습니다.하지만 여전히 혼란 스러울만한 것이 있습니다. 압축 된 Oops가 활성화 된 상태에서 일반적으로 메모리는 바이트가 아닌 Word (64 비트)로 처리됩니다. 압축 된 주소 (32 비트)와 네이티브 가상 메모리 주소가 오른쪽으로 3 비트 이동합니다. 우리는 [link] (http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/)에서 볼 수 있습니다. 9b0ca45cd756/src/share/vm/oops/oop.inline.hpp). 그러나 제 경우에는 shiffed 3 비트 이후 값은 여전히 ​​2^32보다 큽니다. java oops를 압축하는 방법은 무엇입니까? –

+0

압축 된 죄송합니다 귀하의 이해가 약간 불완전하다고 생각합니다. 오라클의 견적은 다음과 같습니다. "Compressed oops는 관리되는 포인터를 64 비트 Java 힙 기본 주소에서 32 비트 개체 오프셋으로 나타냅니다." 압축 된 oops를 32 비트에 맞추는 것은 기본 값 (64 비트 주소)을 누락 한 것입니다. 참조 : http://stackoverflow.com/questions/25120546/trick-behind-jvms-compressed-oops – anttix