Java 中 JAVA_OPTS “-D” 标志的值是否有最大大小限制?
Is there a max size limit on the value of a JAVA_OPTS "-D" flag in Java?
我有一种情况,其中一个 JVM 选项“-D”标志很大,超过 1000 个字符。这个值有多大限制?
-Dhttp.nonProxyHosts=localhost|127.0.0.1|169.254.169.254|162.31.160.0/20|100.77.147.160/27|100.77.163.160/27|100.77.179.160/27|162.18.168.0/23|162.18.170.0/23|162.18.172.0/23|10.100.0.0/16|.internal|.foobr.com|.execute-api.us-west-2.amazonaws.com|.s3.us-west-2.amazonaws.com|.us-west-2.eks.amazonaws.com|.us-west-2.vpce.amazonaws.com|amazonlinux.us-west-2.amazonaws.com|api.sagemaker.us-west-2.amazonaws.com|cloudformation.us-west-2.amazonaws.com|cloudtrail.us-west-2.amazonaws.com|codebuild-fips.us-west-2.amazonaws.com|codebuild.us-west-2.amazonaws.com|config.us-west-2.amazonaws.com|dynamodb.us-west-2.amazonaws.com|ec2.us-west-2.amazonaws.com|ec2messages.us-west-2.amazonaws.com|elasticloadbalancing.us-west-2.amazonaws.com|events.us-west-2.amazonaws.com|kinesis.us-west-2.amazonaws.com|kms.us-west-2.amazonaws.com|logs.us-west-2.amazonaws.com|monitoring.us-west-2.amazonaws.com|runtime.sagemaker.us-west-2.amazonaws.com|secretsmanager.us-west-2.amazonaws.com|servicecatalog.us-west-2.amazonaws.com|sns.us-west-2.amazonaws.com|ssm.us-west-2.amazonaws.com|ssmmessages.us-west-2.amazonaws.com|sts.us-west-2.amazonaws.com
是也不是。情况很复杂。但主要是好消息。
- java无所谓;但是,args 作为字符串传入(而不是作为磁盘流),这意味着存在基于您的内存的限制。但是,1 GB 的文本价值……很多 -D 选项。比你现在多几个数量级。
然而,- shell 和 OS 确实如此。 Windows,例如不能运行命令长度超过8191个字符。你目前有大约 1200 个字符,所以你可以让你的 -D 内容比你现在拥有的内容长 7 倍左右,但是你已经完成了,至少在 windows 上是这样。在 posix 上它依赖于 OS 和 shell,但通常也有限制。
getconf ARG_MAX
通常会告诉你它是什么。在我的桌面系统上,它目前是 1048576,在我可以访问的随机 linux shell 上,它是 2097152。这对你来说有很大的发展空间。
- 使用
@
系统可以避免所有问题。您可以编写 java @foo.txt
,这将导致 java 可执行文件打开 foo.txt
并使用该文件的内容作为参数。所以,把你的巨型 -D 开关放在一个文件中,然后使用 @allThatJazz.txt
而不是 -Dreallylongcommandlineoption
。现在您可以不再关心 OS 强加的 args 限制。
- 鉴于 -D 开关可通过
System.getProperty
获得,您的限制现在与堆相关。在它变得笨拙之前,我们谈论的是数百兆字节 - 可能是 200,000,000 个字符。
我有一种情况,其中一个 JVM 选项“-D”标志很大,超过 1000 个字符。这个值有多大限制?
-Dhttp.nonProxyHosts=localhost|127.0.0.1|169.254.169.254|162.31.160.0/20|100.77.147.160/27|100.77.163.160/27|100.77.179.160/27|162.18.168.0/23|162.18.170.0/23|162.18.172.0/23|10.100.0.0/16|.internal|.foobr.com|.execute-api.us-west-2.amazonaws.com|.s3.us-west-2.amazonaws.com|.us-west-2.eks.amazonaws.com|.us-west-2.vpce.amazonaws.com|amazonlinux.us-west-2.amazonaws.com|api.sagemaker.us-west-2.amazonaws.com|cloudformation.us-west-2.amazonaws.com|cloudtrail.us-west-2.amazonaws.com|codebuild-fips.us-west-2.amazonaws.com|codebuild.us-west-2.amazonaws.com|config.us-west-2.amazonaws.com|dynamodb.us-west-2.amazonaws.com|ec2.us-west-2.amazonaws.com|ec2messages.us-west-2.amazonaws.com|elasticloadbalancing.us-west-2.amazonaws.com|events.us-west-2.amazonaws.com|kinesis.us-west-2.amazonaws.com|kms.us-west-2.amazonaws.com|logs.us-west-2.amazonaws.com|monitoring.us-west-2.amazonaws.com|runtime.sagemaker.us-west-2.amazonaws.com|secretsmanager.us-west-2.amazonaws.com|servicecatalog.us-west-2.amazonaws.com|sns.us-west-2.amazonaws.com|ssm.us-west-2.amazonaws.com|ssmmessages.us-west-2.amazonaws.com|sts.us-west-2.amazonaws.com
是也不是。情况很复杂。但主要是好消息。
- java无所谓;但是,args 作为字符串传入(而不是作为磁盘流),这意味着存在基于您的内存的限制。但是,1 GB 的文本价值……很多 -D 选项。比你现在多几个数量级。 然而,
- shell 和 OS 确实如此。 Windows,例如不能运行命令长度超过8191个字符。你目前有大约 1200 个字符,所以你可以让你的 -D 内容比你现在拥有的内容长 7 倍左右,但是你已经完成了,至少在 windows 上是这样。在 posix 上它依赖于 OS 和 shell,但通常也有限制。
getconf ARG_MAX
通常会告诉你它是什么。在我的桌面系统上,它目前是 1048576,在我可以访问的随机 linux shell 上,它是 2097152。这对你来说有很大的发展空间。 - 使用
@
系统可以避免所有问题。您可以编写java @foo.txt
,这将导致 java 可执行文件打开foo.txt
并使用该文件的内容作为参数。所以,把你的巨型 -D 开关放在一个文件中,然后使用@allThatJazz.txt
而不是-Dreallylongcommandlineoption
。现在您可以不再关心 OS 强加的 args 限制。 - 鉴于 -D 开关可通过
System.getProperty
获得,您的限制现在与堆相关。在它变得笨拙之前,我们谈论的是数百兆字节 - 可能是 200,000,000 个字符。