Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用_JAVA_选项设置-Xss_Java_Linux_Command Line_Stack Size_Javaoptions - Fatal编程技术网

无法使用_JAVA_选项设置-Xss

无法使用_JAVA_选项设置-Xss,java,linux,command-line,stack-size,javaoptions,Java,Linux,Command Line,Stack Size,Javaoptions,我有一些应用程序只有在增加堆栈大小(java选项-Xss1M)的情况下才能正常运行,否则就是错误。 如果我在命令行中使用-Xss1M选项,它就会工作。要将此解决方案集成到Jenkins的工作中,我更喜欢使用_JAVA_OPTIONS环境变量方法,而不是脚本修改 对我来说,令人惊讶的是,如果我说“export\u JAVA\u OPTIONS=-Xss1M”,它就不起作用了。我还尝试设置JAVA_选项和JAVA_工具选项,使用单引号和双引号。结果总是一样的。 特别奇怪的是,Java编写的代码“拾取

我有一些应用程序只有在增加堆栈大小(java选项-Xss1M)的情况下才能正常运行,否则就是错误。 如果我在命令行中使用-Xss1M选项,它就会工作。要将此解决方案集成到Jenkins的工作中,我更喜欢使用_JAVA_OPTIONS环境变量方法,而不是脚本修改

对我来说,令人惊讶的是,如果我说“export\u JAVA\u OPTIONS=-Xss1M”,它就不起作用了。我还尝试设置JAVA_选项和JAVA_工具选项,使用单引号和双引号。结果总是一样的。 特别奇怪的是,Java编写的代码“拾取”了选项,尽管它没有效果:

build@build-solaris-01:tests> /usr/jdk/instances/jdk1.6.0/bin/java -d32 -verbose:gc -classpath ../dist/solaris/forte/prod32mt/cpjdlib.jar: -Djava.library.path=../dist/solaris/forte/prod32mt/dll intern_AFPMMD
Picked up JAVA_TOOL_OPTIONS: -Xss1M
Picked up _JAVA_OPTIONS: -Xss1M
try load: cpjdlib
Successfully loaded library: 'cpjdlib'
 License Valid? true
Segmentation Fault (core dumped)
如果我使用-Xss1M作为命令行选项运行相同的命令,它将起作用:

build@build-solaris-01:tests> /usr/jdk/instances/jdk1.6.0/bin/java -Xss1M -d32 -verbose:gc -classpath ../dist/solaris/forte/prod32mt/cpjdlib.jar: -Djava.library.path=../dist/solaris/forte/prod32mt/dll intern_AFPMMD
Picked up JAVA_TOOL_OPTIONS: -Xss1M
Picked up _JAVA_OPTIONS: -Xss1M
try load: cpjdlib
Successfully loaded library: 'cpjdlib'
 License Valid? true
Success.
在Sunos5.10和Centos4两台机器上,我都有相同的行为。在这两个方面,我都使用JDK 6。 我使用和作为参考,并查看了JAVA_OPTIONS的使用示例。 我没有发现任何提及,好像JAVA选项不接受某些选项或类似的选项。所以我认为它也应该与-Xss一起工作。谁能指出我的错误在哪里

更新1:我确信命令行选项规范与_JAVA_选项实际上并不等同。不仅针对-Xss,还针对其他选项

我在我的Ubuntu14.04上使用了Java7和-XshowSettings:all选项来查看这些选项在“Java内部”是如何显示的。我执行了3个命令并比较了它们的输出(不同之处在于前几行)

$java-XshowSettings:all-version2>&1 | head-5

VM settings:
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
$\u JAVA_OPTIONS=“-Xms2048m-Xmx2048m”JAVA-XshowSettings:all-version 2>&1 | head-5

Picked up _JAVA_OPTIONS: -Xms2048m -Xmx2048m
VM settings:
    Max. Heap Size (Estimated): 1.92G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
VM settings:
    Min. Heap Size: 2.00G
    Max. Heap Size: 2.00G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
Picked up _JAVA_OPTIONS: -Xss1m
VM settings:
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
VM settings:
    Stack Size: 1.00M
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
$java-Xms2048m-Xmx2048m-XshowSettings:all-version2>&1 | head-5

Picked up _JAVA_OPTIONS: -Xms2048m -Xmx2048m
VM settings:
    Max. Heap Size (Estimated): 1.92G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
VM settings:
    Min. Heap Size: 2.00G
    Max. Heap Size: 2.00G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
Picked up _JAVA_OPTIONS: -Xss1m
VM settings:
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
VM settings:
    Stack Size: 1.00M
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
这意味着相同的选项-Xms,-Xmx确实有,但当我们使用_JAVA_options方法时,效果有限。这同样适用于-Xss:

$\u JAVA_OPTIONS=“-Xss1m”JAVA-XshowSettings:all-version 2>&1 | head-5

Picked up _JAVA_OPTIONS: -Xms2048m -Xmx2048m
VM settings:
    Max. Heap Size (Estimated): 1.92G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
VM settings:
    Min. Heap Size: 2.00G
    Max. Heap Size: 2.00G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
Picked up _JAVA_OPTIONS: -Xss1m
VM settings:
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
VM settings:
    Stack Size: 1.00M
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
$java-Xss1m-XshowSettings:all-version2>&1 | head-5

Picked up _JAVA_OPTIONS: -Xms2048m -Xmx2048m
VM settings:
    Max. Heap Size (Estimated): 1.92G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
VM settings:
    Min. Heap Size: 2.00G
    Max. Heap Size: 2.00G
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
Picked up _JAVA_OPTIONS: -Xss1m
VM settings:
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
VM settings:
    Stack Size: 1.00M
    Max. Heap Size (Estimated): 910.25M
    Ergonomics Machine Class: server
    Using VM: Java HotSpot(TM) Server VM
区别在于,只有当-Xss1m是命令行选项时,它才指示“堆栈大小:1.00M”。但是为什么呢!为什么不在_JAVA_OPTIONS下提供完全等效的命令行呢

更新2:分别从和下载了Java源代码的“片段”(“热点”和“jdk”)。注入大量打印输出,并设法从源代码构建java和所有相关库(libjvm.so、rt.jar),然后运行它

根本原因是来自_JAVA_options的选项存储在数组_jvm_args_数组中,该数组不用于调用jdk-9b8c96f96a0f/src/solaris/bin/JAVA_md.c中的thr_create()

有一个地方我们尝试评估堆栈大小,它是从ContinueInNewThread(…)调用JNI_GetDefaultJavaVMInitArgs(void*args),但它只返回默认堆栈大小值,该值等于320K,并且不使用_JAVA_选项。_JAVA_选项的解析稍后在已经创建的线程中进行,看起来完全没有意义

我写了下面的调用序列来说明可能对它感兴趣的人正在发生什么(缩进对应于调用深度)

[jdk-9b8c96f96a0f/src/share/bin/java.c]:JLI_启动(…)
[jdk-9b8c96f96a0f/src/share/bin/java.c]:ContinueInNewThread(调用函数*ifn,int-argc,char**argv,int-mode,char*what,int-ret)//threadStackSize=0(未通过命令行传递)
[hotspot-9b0ca45cd756/src/share/vm/prims/jni.cpp]:jni_GetDefaultJavaVMInitArgs(void*args)//args->javaStackSize=320*1024(已分配默认值),由jdk-9b8c96f96a0f/src/share/bin/java.c中的指针ifn->GetDefaultJavaVMInitArgs(&args1_1)调用
[jdk-9b8c96f96a0f/src/solaris/bin/java_md.c]:ContinueInNewThread0(int(JNICALL*continuation)(void*),jlong stack_size,void*args)//threadStackSize=320*1024
[jdk-9b8c96f96a0f/src/solaris/bin/java_md.c]:thr_create(NULL、堆栈大小、(void*(*)(void*)(void*)continuation、args、flags和tid)//threadStackSize=320*1024
[jdk-9b8c96f96a0f/src/share/bin/java.c]:JavaMain(void*args)//无参数调用(未传递堆栈大小)!
[jdk-9b8c96f96a0f/src/share/bin/java.c]:初始化ejvm(&vm,&env,&ifn)
[hotspot-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]:arguments::parse()//由jdk-9b8c96f96a0f/src/share/bin/java.c中的指针ifn->CreateJavaVM(pvm,(void**)penv和args调用
[热点-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]:参数::parse_vm_init_args(args)
[hotspot-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]:arguments::parse_java_tool_options_environment_variable(&scp,&scp_assembly_required);
[热点-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]:参数::解析_选项_环境_变量(“_JAVA_选项”,scp_p,scp_程序集_必需_p);//这里写着“拾取的JAVA选项:-Xss1m”
[热点-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]:参数::parse_each_vm_init_arg(&vm_args,scp_p,scp_assembly_required_p,ENVIRON_VAR))
[热点-9b0ca45cd756/src/share/vm/runtime/arguments.cpp]:参数::build_jvm_args(选项->选项字符串);//将选项置于_jvm_args_array,该数组稍后可作为jvm_args_array()或jvm_args()访问

(*env)->CallStaticVoidMethod(env,mainClass,mainID,mainArgs);//在运行第一个命令
export\u JAVA\u OPTIONS='-Xss1m'
Yes之前,您是否尝试过以下操作。它让Java向我报告它“拾取了Java选项:-Xss1m”,但没有“堆栈大小:1.00M”指示消息,也没有任何效果(因为我的应用程序出现了SEGFULT,这意味着堆栈大小仍然是默认值).仅出于测试目的…您能将这一行添加到
~/.profile
并重试吗?我试过了,Mr。