我需要检查是否可以传递给JVM的某个选项是显式设置还是具有默认值.
更具体一点:
我需要创建一个具有比默认堆栈大更高的本机堆栈大小的特定线程,但是如果用户希望通过指定-Xss选项来自己处理这些事情,我想创建具有默认堆栈大小的所有线程(这将由用户在-Xss选项中指定).
我检查类,如java.lang.System和java.lang.Runtime,但这些都没有给我有关的信息-Xss.
有没有办法获得我需要的信息?
目前(Java 6)您可以在Java字节码中使用Java语言无法做到的事情吗?
我知道两者都是图灵完整的,所以读"可以做"就是"可以做得更快/更好,或者只是以不同的方式".
我正在考虑invokedynamic使用Java生成的额外字节码,除了特定的字节码是针对未来的版本.
我正在读一本关于编程技巧的书,其中作者问受访者:"你如何崩溃JVM?" 我认为你可以通过编写一个最终耗尽所有内存的无限for循环来实现.
有人有什么想法吗?
根据JLS,int在初始化之后,应该用零填充数组.但是,我遇到的情况并非如此.这种行为首先发生在JDK 7u4中,也发生在所有后续更新中(我使用64位实现).以下代码抛出异常:
public static void main(String[] args) {
int[] a;
int n = 0;
for (int i = 0; i < 100000000; ++i) {
a = new int[10];
for (int f : a)
if (f != 0)
throw new RuntimeException("Array just after allocation: "+ Arrays.toString(a));
Arrays.fill(a, 0);
for (int j = 0; j < a.length; ++j)
a[j] = (n - j)*i;
for (int f : a)
n += f;
}
System.out.println(n);
}
Run Code Online (Sandbox Code Playgroud)
在JVM执行代码块的编译之后发生异常,并且不会出现-Xint标志.此外,该Arrays.fill(...)语句(与此代码中的所有其他语句一样)是必要的,如果不存在则不会发生异常.很明显,这个可能的错误与一些JVM优化有关.出于这种行为的原因有什么想法吗?
更新: …
Java中的方法可以拥有的最大参数数量是什么?为什么?
我在64位Windows系统上使用Java 1.8.
StackOverflow关于此的所有答案都说技术限制是255个参数而没有指定原因.
确切地说,255表示静态,254表示非静态(this在这种情况下将是255)方法.
我认为这可以在某种规范中描述,并且只允许静态定义的最大参数数量.
但这仅适用于int所有4字节类型.我用long参数做了一些测试,在这种情况下我只能声明127个参数.
使用String参数,从测试中推导出的允许数量是255(这可能是因为Java中的引用大小是4个字节?).
但由于我使用的是64位系统,因此引用大小应为8字节宽,因此对于String参数,允许的最大数量应为127,类似于long类型.
这个限制是如何应用的?
限制是否与方法的堆栈大小有关?
注意:我并不是真的会在任何方法中使用这些参数,但这个问题只是为了澄清确切的行为.
请看下面的图片.当我们用java创建一个带有new关键字的对象时,我们从OS获取一个内存地址.
当我们写作时,new我们可以看到一个"特殊"字符串作为输出.我的问题是:
如果是操作系统给我们的内存地址:
a)如何将此字符串转换为二进制?
b)如何获得一个整数变量地址?

我正在尝试运行Java程序,但它采用默认的GMT时区而不是OS定义的时区.我的JDK版本是1.5,操作系统是Windows Server Enterprise(2007)
Windows指定了一个中央时区,但是当我运行以下程序时,它会给我一个GMT时间.
import java.util.Calendar;
public class DateTest
{
public static void main(String[] args)
{
Calendar now = Calendar.getInstance();
System.out.println(now.getTimeZone());
System.out.println(now.getTime());
}
}
Run Code Online (Sandbox Code Playgroud)
这是输出
sun.util.calendar.ZoneInfo[id="GMT",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null]
Mon Mar 22 13:46:45 GMT 2010
Run Code Online (Sandbox Code Playgroud)
请注意,我不想从应用程序设置时区.我希望JVM使用的时区应该是操作系统中指定的时区.(我没有发现其他具有1.4版JDK和Microsoft Server 2003的服务器的问题).
任何想法都将受到高度赞赏.
一种通用方法,可以返回2个参数之间的随机整数,如ruby rand(0..n).
有什么建议吗?
我认为在_JAVA_OPTIONS和之间进行比较会很棒JAVA_TOOL_OPTIONS.我一直在寻找一个,但我找不到任何东西,所以我希望我们能在Stackoverflow上找到这方面的知识.
JAVA_OPTS包括完整性.它不是JVM的一部分,但在野外有很多问题.
到目前为止,我发现:
JAVA_OPTSJDK不使用它,而是由许多其他应用程序使用(请参阅此文章).JAVA_TOOL_OPTIONS并且_JAVA_OPTIONS是将JVM参数指定为环境变量而不是命令行参数的方法.
java和javac_JAVA_OPTIONS (覆盖其他人)JAVA_TOOL_OPTIONS (被其他人覆盖)JAVA_TOOL_OPTIONS和_JAVA_OPTIONSJAVA_TOOL_OPTIONS和之间是否存在任何其他差异_JAVA_OPTIONS(优先级除外).JAVA_TOOL_OPTIONS和_JAVA_OPTIONS(除了java和javac)JAVA_TOOL_OPTIONS和_JAVA_OPTIONS我找不到任何关于的文档_JAVA_OPTIONS.该文件JAVA_TOOL_OPTIONS没有说明差异:
由于无法始终访问或修改命令行,例如在嵌入式VM中或仅在脚本内深入启动的VM,因此提供了JAVA_TOOL_OPTIONS变量,以便在这些情况下可以启动代理.
...
这是我用来解决这个问题的代码.控制台输出包含在注释中:
export JAVA_OPTS=foobar
export JAVA_TOOL_OPTIONS=
export _JAVA_OPTIONS="-Xmx512m -Xms64m"
java -version
# Picked up JAVA_TOOL_OPTIONS:
# Picked up _JAVA_OPTIONS: -Xmx512m -Xms64m
# …Run Code Online (Sandbox Code Playgroud) 我需要解决JDK 1.5中的Java错误,该错误已在1.6中修复.我使用以下条件:
if (System.getProperty("java.version").startsWith("1.5.")) {
...
} else {
...
}
Run Code Online (Sandbox Code Playgroud)
这适用于其他JVM吗?有没有更好的方法来检查这个?