java direct memory_Java VM.maxDirectMemory方法代码示例

import sun.misc.VM; //导入方法依赖的package包/类

static void reserveMemory(long size, int cap) {

if (!memoryLimitSet && VM.isBooted()) {

maxMemory = VM.maxDirectMemory();

memoryLimitSet = true;

}

// optimist!

if (tryReserveMemory(size, cap)) {

return;

}

final JavaLangRefAccess jlra = SharedSecrets.getJavaLangRefAccess();

// retry while helping enqueue pending Reference objects

// which includes executing pending Cleaner(s) which includes

// Cleaner(s) that free direct buffer memory

while (jlra.tryHandlePendingReference()) {

if (tryReserveMemory(size, cap)) {

return;

}

}

// trigger VM's Reference processing

System.gc();

// a retry loop with exponential back-off delays

// (this gives VM some time to do it's job)

boolean interrupted = false;

try {

long sleepTime = 1;

int sleeps = 0;

while (true) {

if (tryReserveMemory(size, cap)) {

return;

}

if (sleeps >= MAX_SLEEPS) {

break;

}

if (!jlra.tryHandlePendingReference()) {

try {

Thread.sleep(sleepTime);

sleepTime <<= 1;

sleeps++;

} catch (InterruptedException e) {

interrupted = true;

}

}

}

// no luck

throw new OutOfMemoryError("Direct buffer memory");

} finally {

if (interrupted) {

// don't swallow interrupts

Thread.currentThread().interrupt();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值