日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java bytebuffer 大小_java – 为什么DirectByteBuffer.array()有额外的大小?

發(fā)布時(shí)間:2023/12/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java bytebuffer 大小_java – 为什么DirectByteBuffer.array()有额外的大小? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我的代碼是:

if (frameRGBABuffer == null) {

frameRGBABuffer = ByteBuffer.allocateDirect(cameraHeight * cameraWidth * 4)

.order(ByteOrder.nativeOrder());

}

Log.d("tag",frameRGBABuffer.array().length)

我的相機(jī)分辨率是1280×720,因此frameRGBABuffer應(yīng)該分配3686400字節(jié)的空間.

但是很奇怪frameRGBABuffer.array()的長(zhǎng)度是3686407.為什么它有額外的7個(gè)字節(jié)空格?

順便說(shuō)一下,frameRGBABuffer.array()不會(huì)拋出異常并返回帶有數(shù)據(jù)的byte []

似乎Android分配了7個(gè)額外的空間來(lái)處理對(duì)齊.

源代碼是:

MemoryRef(int capacity) {

VMRuntime runtime = VMRuntime.getRuntime();

buffer = (byte[]) runtime.newNonMovableArray(byte.class, capacity + 7);

allocatedAddress = runtime.addressOf(buffer);

// Offset is set to handle the alignment: http://b/16449607

offset = (int) (((allocatedAddress + 7) & ~(long) 7) - allocatedAddress);

isAccessible = true;

isFreed = false;

}

解決方法:

這是它背后的代碼(JVM,不是Android,但在Android上可能類似):

DirectByteBuffer(int cap) { // package-private

super(-1, 0, cap, cap);

boolean pa = VM.isDirectMemoryPageAligned();

int ps = Bits.pageSize();

long size = Math.max(1L, (long)cap + (pa ? ps : 0));

Bits.reserveMemory(size, cap);

long base = 0;

try {

base = unsafe.allocateMemory(size);

} catch (OutOfMemoryError x) {

Bits.unreserveMemory(size, cap);

throw x;

}

unsafe.setMemory(base, size, (byte) 0);

if (pa && (base % ps != 0)) {

// Round up to page boundary

address = base + ps - (base & (ps - 1));

} else {

address = base;

}

cleaner = Cleaner.create(this, new Deallocator(base, size, cap));

att = null;

VM.isDirectMemoryPageAligned()< ---是關(guān)鍵

// User-controllable flag that determines if direct buffers should be page

// aligned. The "-XX:+PageAlignDirectMemory" option can be used to force

// buffers, allocated by ByteBuffer.allocateDirect, to be page aligned.

這是性能低級(jí)的東西.

標(biāo)簽:bytebuffer,android,java

來(lái)源: https://codeday.me/bug/20190828/1747249.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的java bytebuffer 大小_java – 为什么DirectByteBuffer.array()有额外的大小?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。