从JVM中清除所有加载的类
Clearing all loaded classes from the JVM
我通过JNI创建了一个JVM,如下所示:
bool JavaVM_Create(Jvm* &ptr, int argc, const char* argv[])
{
bool result = false;
if (!ptr && argc > 0)
{
ptr = new Jvm();
JavaVMInitArgs jvm_args;
JavaVMOption* options = new JavaVMOption[argc];
for (int i = 0; i < argc; ++i)
{
options[i].optionString = const_cast<char*>(argv[i]);
}
JNI_GetDefaultJavaVMInitArgs(&jvm_args);
jvm_args.version = JNI_VERSION_1_8;
jvm_args.nOptions = 2;
jvm_args.options = options;
jvm_args.ignoreUnrecognized = false;
result = true;
jint num_vms = 0;
JavaVM* vms[5] = {0};
if (JNI_GetCreatedJavaVMs(vms, 5, &num_vms) == JNI_OK)
{
if (num_vms > 0)
{
ptr->vm = vms[0];
ptr->vm->AttachCurrentThread();
delete[] options;
return result;
}
}
if (!ptr->createJVM(&jvm_args))
{
result = false;
}
delete[] options;
}
return result;
}
void JavaVM_Free(Jvm* &ptr)
{
if (ptr && ptr->vm)
{
ptr->vm->DetachCurrentThread();
ptr->vm->DestroyJavaVM();
}
delete ptr;
ptr = nullptr;
}
我使用JNI_GetCreatedJavaVMs
的原因是为了修复JDK中的错误,它指出:
jint DestroyJavaVM(JavaVM*vm);
卸载Java虚拟机并回收其资源。支持DestroyJavaVM在JDK/JJRE 1.1中不完整。仅从JDK/JJRE 1.1起主线程可以调用DestroyJavaVM。由于JDK/JJRE 1.2,无论是否附加,都可以调用此函数。如果当前线程连接,VM等待,直到当前线程是唯一的非守护进程用户级Java线程。如果当前线程不是连接,虚拟机连接当前线程,然后等待,直到当前线程是唯一的非守护进程用户级线程JDK/JRE仍然不支持VM卸载,但是。
正因为如此,我无法"创造、摧毁、创造、摧毁和重复"。相反,我必须创建一个实例,并在应用程序的生命周期内保留该实例,只有在应用程序即将关闭时才销毁该实例。
这很糟糕,因为如果我想将两个不同的jar加载到JVM中,我就做不到。它们可能具有或不具有相同名称的类。记忆使用率飙升。
因此,我试图找到一种方法,要么完全卸载JVM(销毁它),要么卸载所有已加载的类(重置它)。
有什么想法或解决方案吗?
实现这一点的最简单方法是启动一个新进程,并销毁已完成的进程。
另一种解决方案是使用ClassLoader来加载以后要卸载的类。当ClassLoader被卸载时,它的所有类都被释放。
BTW您可以同时加载多个ClassLoader,甚至可以加载同一类的不同版本。
IMHO试图从JNI创建和摧毁JVM是非常棘手的(尽管不像过去那么棘手),我只能在万不得已的情况下这样做。有很多方法可以实现你想要的,这要简单得多。
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- Python ctypes:不会按预期加载 dll
- 为什么会出现 gettnig 运行时错误:加载类型为"_Bit_type"(stl_bvector.h) 的空指针?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 保存/加载大量短数组到二进制文件
- 使用 SDL2 和SDL_image C++加载图像
- 无法使用加载库卸载注入的 dll (C++)
- jvm.dll 上的加载库失败,错误代码为 183
- 加载共享库时出错:JVM.dll
- 无法加载JVM
- 无法使用LoadLibrary加载jvm.dll