【发布时间】:2011-11-01 11:06:51
【问题描述】:
这发生在带有 64 位应用程序的 linux 2.6.18-238.5.1.el5 上。我的进程堆栈大小为 10MB。但是,在(成功)调用 JNI_CreateJavaVM 之后,堆栈上似乎只剩下 1-2 MB。如果我通过它 - 我会出现内存错误,就好像我溢出堆栈一样。
一些注意事项:
- 如果我不创建 JVM,那么我可以访问整个 10MB 堆栈。
- 具有相同 makefile 的相同测试程序在 Solaris 上运行良好,即使调用 JVM 也是如此
测试来源:
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
void CreateVM(JavaVM ** jvm) {
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString = (char*)"-Xcheck:jni";
vm_args.version = JNI_VERSION_1_6;
vm_args.nOptions = 0;
vm_args.options = options;
vm_args.ignoreUnrecognized = 0;
int ret = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);
if(ret < 0) {
printf("\nUnable to Launch JVM\n");
exit(1);
}
if ( env->ExceptionCheck() == JNI_TRUE ) {
printf("exception\n");
exit(1);
}
}
void f() {
printf("inside...\n");
//eat up a few megs of stack
char stackTest[0x2FFFFF];
printf("...returning");
}
int main(int argc, char* argv[]) {
JavaVM * jvm;
CreateVM(&jvm);
f();
printf("exiting...\n");
return 0;
}
构建命令:
g++ -m64 CTest.cpp -I/import/bitbucket/JDK/jdk1.6.0_26/include -I/import/bitbucket/JDK/jdk1.6.0_26/include/linux -L/import/bitbucket/JDK/ jdk1.6.0_26/jre/lib/amd64 -L/import/bitbucket/JDK/jdk1.6.0_26/jre/lib/amd64/server -ljava -ljvm
【问题讨论】:
-
你能做一个
strace -f a.out并在互联网上发布结果吗?
标签: linux jvm stack java-native-interface