Java에서 바이트 배열을 고정하는 방법이 있나요? 이동/압축되지 않습니다.바이트 배열을 Java로 고정하는 방법은 무엇입니까?
런타임 중에 GC가 0 인 응용 프로그램에서 작업 중이며 메모리 매핑 된 영역에 고정되어있는 기본 바이트 배열을 사용하려고합니다. 이것을하거나 해킹 할 수있는 방법이 있습니까?
Java에서 바이트 배열을 고정하는 방법이 있나요? 이동/압축되지 않습니다.바이트 배열을 Java로 고정하는 방법은 무엇입니까?
런타임 중에 GC가 0 인 응용 프로그램에서 작업 중이며 메모리 매핑 된 영역에 고정되어있는 기본 바이트 배열을 사용하려고합니다. 이것을하거나 해킹 할 수있는 방법이 있습니까?
정말 가비지 콜렉션이 없습니까? 정말?
그래서, 나는 두 가지 옵션 중 하나를 제안하는 경우 :
편집 :
당신이 정적 바이트 배열을 할당 고려해야 나에게 발생했습니다. 즉, 이런 식으로 뭔가 :이 직접 메모리 매핑, 여전히 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;
}
가비지 콜렉션이 전혀 없습니다. 내 응용 프로그램은 시작할 때 모든 것을 할당하고 더 이상 할당하지 않습니다. 하지만, JVM이 GC를 실행하지 않고 내 힙을 압축하지 않을 것이라는 보장이 없다고 생각합니다. 이것이 내 관심사입니다. 일관성있는 중간 대기 시간 및 평균 처리량과 달리 전체적으로 높은 대기 시간과 낮은 대기 시간을 원하기 때문에 실시간 JVM을 사용하지 않으려합니다. –
배열을 미리 할당해도 가비지 수집 중에 이동되지 않습니다. (다른 것이 GC를 트리거한다고 가정하십시오.) – finnw
ByteBuffer/allocateDirect()를 사용할 수 있습니다. "c"공간에 있고 힙을 사용하지 않는 바이트 버퍼를 생성하므로 이동되지 않으며 효율적으로 JNI 호출에서 사용할 수 있습니다.
바이트 버퍼는 바이트 배열보다 성능이 좋지 않으므로 사용하지 않으려합니다. –
정말요? 그리고 ByteBuffer의 요점은 성능을 향상시키는 것이라고 생각했습니다 (특정 작업에 대해서는 최소한);)이 기능이 필요하거나 필요하지 않습니다. –
피터가 맞고 직접적인 NIO 버퍼는 일반적으로 이동되지 않고 JNI 호출에 적합하기 때문에 수많은 Java 바인딩에서 사용됩니다. – gouessej
https://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/을 참조하십시오. 리플렉션을 사용하거나 코드를 특정 JVM에 묶지 않고 사용하려면 기존 길이와 동일한 길이의 배열이나 배열이 아닌 객체의 얕은 복사본을 만들어야합니다.
질문 할 수 있습니까? 이유가 무엇입니까? 애플리케이션에 GC가 필요없는 이유와 배열을 고정해야하는 이유는 무엇입니까? – Mnementh
RDMA를 프로세스에 통합하려고하는데 최상의 성능을 원합니다. 내 응용 프로그램에 대기 시간이 매우 중요하고 3ms 동안 일시 중지하지 않아야하기 때문에 응용 프로그램에 GC가 필요 없습니다. 바이트 배열 액세스 성능이 바이트 버퍼보다 훨씬 좋기 때문에 바이트 배열을 고정시키고 직접 바이트 버퍼를 지정하지 않겠습니까? –