2009-07-11 3 views
3

Java에서 바이트 배열을 고정하는 방법이 있나요? 이동/압축되지 않습니다.바이트 배열을 Java로 고정하는 방법은 무엇입니까?

런타임 중에 GC가 0 인 응용 프로그램에서 작업 중이며 메모리 매핑 된 영역에 고정되어있는 기본 바이트 배열을 사용하려고합니다. 이것을하거나 해킹 할 수있는 방법이 있습니까?

+0

질문 할 수 있습니까? 이유가 무엇입니까? 애플리케이션에 GC가 필요없는 이유와 배열을 고정해야하는 이유는 무엇입니까? – Mnementh

+0

RDMA를 프로세스에 통합하려고하는데 최상의 성능을 원합니다. 내 응용 프로그램에 대기 시간이 매우 중요하고 3ms 동안 일시 중지하지 않아야하기 때문에 응용 프로그램에 GC가 필요 없습니다. 바이트 배열 액세스 성능이 바이트 버퍼보다 ​​훨씬 좋기 때문에 바이트 배열을 고정시키고 직접 바이트 버퍼를 지정하지 않겠습니까? –

답변

5

정말 가비지 콜렉션이 없습니까? 정말?

그래서, 나는 두 가지 옵션 중 하나를 제안하는 경우 :

  1. 사용하십시오 real-time JVM. 일반 응용 프로그램을 소프트 실시간 시스템에서 하드 실시간 시스템으로 분리하는 거의 모든 것을 관리하는 옵션이 있습니다.
  2. 특정 실행 중에 필요한 것보다 훨씬 많은 메모리를 할당하는 것에 대해 매우 진지하게 생각하십시오. 이것은 정교한 해결책은 아니지만 메모리를 사용할 수있는 경우 코어 풋 프린트에 필요한 것보다 10 배 더 할당하십시오. 그것은 효과가있을 수 있으며, RAM은 소프트웨어 엔지니어링 인력보다 저렴하다는 것을 인정해야합니다. 훨씬 나중에

편집 :

당신이 정적 바이트 배열을 할당 고려해야 나에게 발생했습니다. 즉, 이런 식으로 뭔가 :이 직접 메모리 매핑, 여전히 GC'd되지 않습니다 참고할 수의 객체에 관련이없는거야하지만

/** Byte arrays that you absolutely have to keep. */ 
public class KeepForever { 
    /** Note that I make no claims about thread safety in this simple example. */ 
    public static byte [] keepMe = new byte[100]; 
}; 

// Much later in example code .... 

/** This should always succeed. No worries about garbage collection. */ 
public void setMe(int index, byte newByte) { 
    // Admittedly, this defeats several principles of OOD but it makes 
    // the point about the syntax. 
    KeepForever.keepMe[index] = newByte; 
} 
+0

가비지 콜렉션이 전혀 없습니다. 내 응용 프로그램은 시작할 때 모든 것을 할당하고 더 이상 할당하지 않습니다. 하지만, JVM이 GC를 실행하지 않고 내 힙을 압축하지 않을 것이라는 보장이 없다고 생각합니다. 이것이 내 관심사입니다. 일관성있는 중간 대기 시간 및 평균 처리량과 달리 전체적으로 높은 대기 시간과 낮은 대기 시간을 원하기 때문에 실시간 JVM을 사용하지 않으려합니다. –

+1

배열을 미리 할당해도 가비지 수집 중에 이동되지 않습니다. (다른 것이 GC를 트리거한다고 가정하십시오.) – finnw

0

. 참조가 살아있는 곳이면 어디든 괜찮습니다.

+0

generational-GC를 사용하면 메모리에서 이동할 것입니다. – Mnementh

6

ByteBuffer/allocateDirect()를 사용할 수 있습니다. "c"공간에 있고 힙을 사용하지 않는 바이트 버퍼를 생성하므로 이동되지 않으며 효율적으로 JNI 호출에서 사용할 수 있습니다.

+0

바이트 버퍼는 바이트 배열보다 성능이 좋지 않으므로 사용하지 않으려합니다. –

+2

정말요? 그리고 ByteBuffer의 요점은 성능을 향상시키는 것이라고 생각했습니다 (특정 작업에 대해서는 최소한);)이 기능이 필요하거나 필요하지 않습니다. –

+1

피터가 맞고 직접적인 NIO 버퍼는 일반적으로 이동되지 않고 JNI 호출에 적합하기 때문에 수많은 Java 바인딩에서 사용됩니다. – gouessej