gpt4 book ai didi

java - 防止java程序开启线程

转载 作者:行者123 更新时间:2023-11-30 08:36:30 25 4
gpt4 key购买 nike

我正在尝试运行一个 java 应用程序,更具体地说是一个 jar 编译的应用程序,使用 c 中的 execve()
类似的东西:

char *cmd[] = {"a.jar"};
execve("a.jar",cmd,NULL);

这工作正常,但是当我尝试使用类似的方法限制该程序可以打开的线程数时:

struct rlimit rlp;
rlp.rlim_cur = rlp.rlim_max = limit_nproc;
setrlimit(RLIMIT_NPROC,&rlp);

我的 JVM 有问题,它会打开线程,我正在阻止它,所以我有这个错误:

java.lang.OutOfMemoryError: Cannot create GC thread. Out of system resources.

如何防止在 java 应用程序中打开线程而不是 JVM 打开的线程? !

请注意,问题是如何阻止用户线程而不是系统线程,我需要像我在第二个代码“RLIMIT_NPROC”中所做的那样限制运行环境

谢谢!

最佳答案

这可以通过 JVMTI 实现代理。

想法是拦截原生的Thread.start0() 方法并在调用时抛出异常。

这是一个用 C++ 编写的示例代理:

#include <jvmti.h>

// Original native implementation of Thread.start0(), if you wish to call it
extern "C" void JNICALL JVM_StartThread(JNIEnv* env, jthread thread);

void JNICALL StartThreadHook(JNIEnv* env, jthread thread) {
env->ThrowNew(env->FindClass("java/lang/Error"), "Threads forbidden");
}

void JNICALL VMInit(jvmtiEnv* jvmti, JNIEnv* env, jthread thread) {
// After VM is initialized, intercept Thread.start0() with our hook function
jclass thread_class = env->FindClass("java/lang/Thread");
JNINativeMethod start0 = {(char*)"start0", (char*)"()V", (void*)StartThreadHook};
env->RegisterNatives(thread_class, &start0, 1);
}

JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM* vm, char* options, void* reserved) {
jvmtiEnv* jvmti;
vm->GetEnv((void**)&jvmti, JVMTI_VERSION_1_0);

jvmtiEventCallbacks callbacks = {0};
callbacks.VMInit = VMInit;
jvmti->SetEventCallbacks(&callbacks, sizeof(callbacks));
jvmti->SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL);

return 0;
}

编译代理:

g++ -fPIC -shared -olibnothreads.so -Wl,-soname,libnothreads.so nothreads.cpp

使用代理运行应用程序:

java -agentpath:/path/to/libnothreads.so -jar app.jar

请注意,您还可以使用 JVMTI 来实现自定义逻辑,何时允许以及何时拒绝启动新线程。例如,ThreadStartThreadEnd事件将有助于计算创建的线程。 GetStackTrace函数将有助于找到哪些类正在尝试创建线程。

关于java - 防止java程序开启线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37701164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com