Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Unity]/[UE] v8 FunctionTemplate产生的Function会被v8 cache住不释放的问题 #1945

Open
chexiongsheng opened this issue Dec 16, 2024 · 1 comment

Comments

@chexiongsheng
Copy link
Collaborator

chexiongsheng commented Dec 16, 2024

detail | 详细描述

根据v8的标准做法,原生对象通过FunctionTemplate来封装。
但FunctionTemplate->GetFunction之后,这个Function会被缓存下来(在一个slow_template_instantiations_cache对象里,在用inspector的memory snapshot可以看到),甚至FunctionTemplate不引用,Function也一直不释放。

在unity的这个版本 668369e 可以很容易的观察到这现象:
pesapi_create_function可以构造一个函数,并且期望这个函数释放时,能够触发finalize回调,但实际上这回调一直不释放,而同样通过SetWeak去注册gc回调的c#对象是可以触发回调的。

而有个项目通过看v8源码发现,这个行为默认如此,也没发现直接的接口可以调整这个行为,但有个hacker的方式:如果FunctionTemplate Set了一个ObjectTemplate后,这个FunctionTemplate 就会变成不cache函数。
17340822553396

可以通过这个来实现函数的回收。

@chexiongsheng
Copy link
Collaborator Author

对于pesapi_create_function直接用这个hacker方式是安全的,但其它地方需要考虑no_cache后,每次函数都会是新的问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant