v4.0.28->v4.1.19 변경시 UnsupportedOperationException: direct buffer 관련 문의

872 views
Skip to first unread message

confi...@gmail.com

unread,
Jan 17, 2018, 8:33:18 AM1/17/18
to Netty Korean User Group
안녕하세요. 
소스 분석 중에 문제를 못찾아 이렇게 
힌트를 얻고 싶어 문의 드립니다..ㅠㅠ

초보라 질문의 부족한 점이 있더라도 너그럽게 이해 부탁드립니다..!

기존 v4.0.28 에서
메시지 수신 받아서 ByteBuf에 들어가고
Bytebuf buf = ByteBuf.readBytes(2);
byte[] b = buf.array();
이 부분이 정상 동작 됬었습니다.

그런데 버전 v4.1.19 적용 후
같은 소스인데 UnsupportedOperationException: direct buffer 에러를 출력해서 [buf :  PooledUnsafeDirectByteBuf(ridx: 0, widx: 2, cap: 2)]
구글 검색으로 알아 봤는데 buf.hasArray()가 false 이기 때문이라고 하는데 
버전 업데이트되고 무엇이 달라졌기에 이와 같은 현상이 나타나는 걸까요..

저와 같은 경험을 해보신 분 정보 공유 좀 부탁드립니다..!

Trustin Lee (trustin)

unread,
Jan 24, 2018, 9:30:53 AM1/24/18
to nett...@googlegroups.com, Netty Korean User Group
안녕하세요, 회신이 늦어 대단히 죄송합니다.

ByteBuf에는 두 종류 - heap과 direct - 가 있습니다. 보통 direct 버퍼의 경우 hasArray()가 false 입니다.

4.0과는 달리 4.1부터는 기본 버퍼 타입이 heap에서 direct로 변경되었습니다. heap 버퍼의 경우 소켓에 버퍼를 쓰게 될 때 direct버퍼로 한 번 복사한 뒤에 써야 하기 때문에 성능상 불이익이 있기 때문입니다. 따라서 많은 경우 hasArray()가 false일 수 있습니다.

만약 버퍼의 내용을 배열로 변환하고자 한다면, hasArray()가 false인 경우 배열을 할당한 뒤 복사해야 합니다. 보통 다음과 같은 방식입니다:

byte[] array;
int offset;
int length;

if (buf.hasArray()) {
array = buf.array();
offset = buf.arrayOffset() + buf.readerIndex();
length = buf.readableBytes();
} else {
array = new byte[buf.readableBytes()];
offset = 0;
length = array.length();
buf.getBytes(buf.readerIndex(), array);
}

이희승 / Trustin Lee / イ·ヒスン
--
이 메일은 Google 그룹스 'Netty Korean User Group' 그룹에 가입한 분들에게 전송되는 메시지입니다.
이 그룹에서 탈퇴하고 더 이상 이메일을 받지 않으려면 netty-ko+u...@googlegroups.com에 이메일을 보내세요.
더 많은 옵션을 보려면 https://groups.google.com/d/optout을(를) 방문하세요.
Reply all
Reply to author
Forward
0 new messages