Java NIO ByteBuffer 상세 설명: [url]http://donald-draper.iteye.com/blog/2357084[/url] [size = medium] [b] 머리말: [/ b] [/ size] 지난 글 에서 우 리 는 HeapByteBuffer 를 보 았 고 오늘 은 또 다른 DirectByteBuffer 를 보 았 다.DirectByteBuffer 를 보기 전에 DirectByteBuffer 의 부류 인 MappedByteBuffer 를 살 펴 보 자.
/** * A direct byte buffer whose content is a memory-mapped region of a file. *MappedByteBuffer region。 * Mapped byte buffers are created via the {@link * java.nio.channels.FileChannel#map FileChannel.map} method. This class * extends the {@link ByteBuffer} class with operations that are specific to * memory-mapped file regions. *MappedByteBuffer java.nio.channels.FileChannel#map 。MappedByteBuffer ByteBuffer, regions 。 *
A mapped byte buffer and the file mapping that it represents remain * valid until the buffer itself is garbage-collected. * , ,MappedByteBuffer 。 *
The content of a mapped byte buffer can change at any time, for example * if the content of the corresponding region of the mapped file is changed by * this program or another. Whether or not such changes occur, and when they * occur, is operating-system dependent and therefore unspecified. *MappedByteBuffer , region 。 , , 。 *
이 방법 중의 주소 address 가 어디에서 왔 는 지 보 세 요. / / 실제 시작 주소 가 져 오기
private long mappingAddress(long mappingOffset) { return address - mappingOffset; }
//Buffer
public abstract class Buffer {
// Invariants: mark <= position <= limit <= capacity private int mark = -1; private int position = 0; private int limit; private int capacity;
// Used only by direct buffers // NOTE: hoisted here for speed in JNI GetDirectBufferAddress //Direct buffer long address; }
MappedByteBuffer 와 물리 메모리 파일 맵 방법 load 의 Bits. pageCount, Bits. pageSize () 를 만 듭 니 다.
public final MappedByteBuffer load() { checkMapped(); // null if ((address == 0) || (capacity() == 0))// 0, true return this; long offset = mappingOffset();// long length = mappingLength(offset);// , load0(mappingAddress(offset), length);
// Read a byte from each page to bring it into memory. A checksum // is computed as we go along to prevent the compiler from otherwise // considering the loop as dead code. Unsafe unsafe = Unsafe.getUnsafe(); int ps = Bits.pageSize();// int count = Bits.pageCount(length);// long a = mappingAddress(offset); byte x = 0; // MappedByteBuffer for (int i=0; i x ^= unsafe.getByte(a); a += ps; } if (unused != 0) unused = x;
return this; }
//Bits
private static final Unsafe unsafe = Unsafe.getUnsafe(); static int pageCount(long size) { return (int)(size + (long)pageSize() - 1L) / pageSize(); } private static int pageSize = -1; static int pageSize() { if (pageSize == -1) pageSize = unsafe().pageSize(); return pageSize; } static Unsafe unsafe() { return unsafe; }
//Unsafe
public native int pageSize();
[size=medium][b] 결론: [/ b] [/ size] [color = blue] MappedbyteBuffer 는 캐 시 영역 데 이 터 를 실제 물리 적 메모리 에 페이지 별로 저장 하고 맵 을 만 듭 니 다.우 리 는 일반적으로 MappedByteBuffer 를 직접 사용 하지 않 고 MappedByteBuffer 의 하위 클래스 DirectByteBuffer 를 사용한다.뒤에 있 는 java. nio. channels. FileChannel 관련 글 에서 우 리 는 다시 한 번 MappedByteBuffer 를 언급 했다. [/color]
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다: