学习j2v8--使用J2V8改进了内存管理

使用J2V8改进了内存管理

前言:本文章只是个人翻译自用,不喜欢者勿喷

最近在研究android与js交互
奈何本人能力有限,又是英语渣渣,特用机译方便理解

J2V8中的内存管理从未如此轻松。因为J2V8是V8和Java的桥梁,所以正在使用三种不同的内存模型。Java和JavaScript都通过自己的GC提供了托管内存模型。位于中间的JNI / C ++完全不受管理。这导致了一个复杂的情况,因为JavaScript和Java都会在认为内存未使用但彼此不了解的情况下释放内存。为了解决这个问题,J2V8承担了Java开发人员的责任,以指定应保留哪些对象以及可以释放哪些对象。

但是,记住释放所有V8Objects既容易出错又乏味。在J2V8 4.5中,引入了新的MemoryManager。

一旦实例化,MemoryManager被认为是活动的,并将跟踪所有V8Object。当的MemoryManager被释放时,所有跟踪的对象也将被释放。作为开发人员,您可以在块的开头创建MemoryManager的实例,执行几个J2V8调用,最后在块的末尾释放MemoryManager。按照这种模式,可以确保在执行该块期间没有内存泄漏。

下面是一个使用Node.js和lodash来操作某些对象的简单示例。在此示例中,必须手动跟踪和释放每个对象。由于API无法链接,因此这将导致非常冗长的代码。

loDash = nodeJS.require(new File("/Users/irbull/node_modules/lodash"));

V8Object o1 = o("a", 1);
V8Object o2 = o("b", 2);
V8Object o3 = o("c", 3);
V8Object objects = (V8Object) loDash.executeJSFunction("assign", o1, o2, o3);
LoDashObject e1 = loDash(objects);
LoDashObject e2 = e1.e("values");
V8Function f = f((V8Object receiver, V8Array parameters) -> parameters.getInteger(0) * 3);
LoDashObject result = e2.e("map",f);
System.out.println(result);

loDash.release();
e1.release();
e2.release();
f.release();
o1.release();
o2.release();
o3.release();
result.release();
objects.release();

使用新的MemoryManager,此代码中的API大大简化了。

MemoryManager scope = new MemoryManager(v8);
loDash = nodeJS.require(new File("/Users/irbull/node_modules/lodash"));

V8Object objects = (V8Object) loDash.executeJSFunction("assign", o("a", 1), o("b", 2), o("c", 3));
LoDashObject result = loDash(objects).e("values").e("map",
  f((V8Object receiver, V8Array parameters) -> parameters.getInteger(0) * 3));
System.out.println(result);

scope.release();

在此示例中,在该块的开头创建了一个MemoryManager。对lodash的所有调用都可以内联执行,并且所有API调用都已链接。最后,释放MemoryManager,并释放在该块期间分配的所有V8句柄。

如果您希望保留一些对象以备将来使用,MemoryManager将提供一个持久性 API。例如,我们可以在结果对象上使用它。

MemoryManager也可以嵌套。在输入和离开新范围时,可以创建一个新的MemoryManager来管理该范围内的对象。所有以前的MemoryManager都会收到有关所有新对象创建和删除的通知。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
内存溢出的原因可能是由于以下几个方面: 1. 大量对象创建:J2V8 在与 V8 引擎交互时会创建一些对象,如果你的代码中频繁创建大量的对象,并且没有及时释放,就会导致内存溢出。 2. 长时间运行:如果你的应用程序长时间运行,而且在运行过程中持续地使用 J2V8,可能会导致内存积累,最终引发内存溢出。 3. 内存泄漏:J2V8使用可能存在内存泄漏问题,如果你没有正确管理资源,例如没有及时释放 V8 的上下文或其他对象,就会导致内存泄漏,最终导致内存溢出。 4. 过大的数据集:如果你在使用 J2V8 处理大型数据集时,例如大型文件或者大规模的数据集,可能会占用大量内存,超出 JVM 的限制,从而导致内存溢出。 为了解决这个问题,你可以尝试以下几个步骤: 1. 检查代码:仔细检查你的代码,确保没有频繁创建大量的对象,并且及时释放不再使用的对象。 2. 内存管理:正确地管理 J2V8 的资源,包括释放 V8 上下文、关闭 V8 引擎等。确保在不需要时及时释放资源。 3. 优化算法:如果可能的话,优化你的数据处理算法,减少内存占用。可以考虑使用流式处理或分批处理大型数据集。 4. 增加 JVM 内存:根据你的应用需求,适当增加 JVM 的内存限制,以容纳更多的对象和数据。 如果问题仍然存在,你可能需要进一步调查和分析代码,或者考虑寻求专业的支持来解决内存溢出问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

╰つ゛无名小姐‭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值