js 执行引擎说明
内核演变
Gecko(Netscape) - Trident(IE) - Gecko(firefox Mozilla) - Safari(webkit) - Chrome(Chromium) - Chrome(blink)
javascript引擎 / 什么是J2V8/为什么要使用J2V8
v8 引擎是使用c++编写的,java要使用v8需要通过jni桥接,j2v8 就是起到这样的桥接作用
可用性+性能 => j2v8 > javaScrpitCore
J2v8 相对于 javaScriptCore 性能更优,具体优化了JNI的调用性能问题
J2v8对内存使用上的优化通过暴露api提供释放内存能力
内存管理
1手动管理的部分
j2v8 来说,以下对象必须手动释放:
自行创建的对象。例如 new V8Object() 创建的。
从 js 中主动获取的对象。例如 v8.getObject(xxx).
从 js 数组中提取的。例如 v8Array.getObject(0).
注意:
c++ 层作为参数传入到 java 的对象无需释放。因为它不是 java 自己创建的。
但是若传入的是数组,那么从数组中获取的对象必须释放,因为它是 java 主动获取的。
创建出的用作传给(或返回给) js 的对象必须释放,因为它是 java 创建的。
2 自动管理[MemoryManager]
使用MemoryManager 前
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后
MemoryManager scope = new MemoryManager(v8); // 实例化 MemoryManager
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(); // 释放
多线程
j2v8中使用runtime(v8 createV8Runtime)必须要统一线程使用(提供多线程的能力的同时保障多线程之间信息j2v8相关内容交互)
以下是AsyncTask的使用例子
override fun onPreExecute() {
super.onPreExecute()
if (v8.locker.hasLock()){
v8.locker.release() // 释放主线程的锁
}
}
override fun doInBackground(vararg params: int?): int {
v8.locker.acquire() // 子线程获得锁
// 执行一些 v8 操作
// ...
v8.locker.release() // 释放子线程的锁
return 1
}
override fun onPostExecute(result: int?) {
super.onPostExecute(result)
v8.locker.acquire() // 主线程重新获得锁
}
}