有没有办法,无论是在代码中还是在JVM参数中,都可以覆盖当前时间,如System.currentTimeMillis手动更改主机上的系统时钟所示?
一点背景:
我们有一个系统可以运行许多会计工作,这些工作围绕当前日期(即本月的第一天,一年中的第一天等)展开大部分逻辑.
不幸的是,很多遗留代码都会调用诸如new Date()or之类的函数,这些函数Calendar.getInstance()最终都会调用System.currentTimeMillis.
出于测试目的,我们现在仍然需要手动更新系统时钟来操作代码认为运行测试的时间和日期.
所以我的问题是:
有没有办法覆盖返回的内容System.currentTimeMillis?例如,告诉JVM在从该方法返回之前自动添加或减去一些偏移量?
提前致谢!
我需要将证书导入我的JVM密钥库.我使用以下内容:
keytool -import -alias daldap -file somecert.cer
Run Code Online (Sandbox Code Playgroud)
所以我需要将我的调用改为:
keytool -import -alias daldap -file somecert.cer -keystore cacerts –storepass changeit
Run Code Online (Sandbox Code Playgroud) 我试过看类似的,没有解决方案有效.我以前运行的应用程序没有问题,但我的新应用程序突然开始给我带来问题.当我尝试运行它时总是失败说:
Error:Execution failed for task ':app:preDexDebug'.
com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files (x86)\Java\jdk1.7.0_67\bin\java.exe'' finished with non-zero exit value 1
Run Code Online (Sandbox Code Playgroud)
以下是控制台显示的内容:
Executing tasks: [:app:assembleDebug]
Configuration on demand is an incubating feature.
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:compileDebugNdk UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportSupportV42200Library UP-TO-DATE
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources UP-TO-DATE
:app:generateDebugSources UP-TO-DATE
:app:compileDebugJava UP-TO-DATE
:app:preDexDebug
AGPBI: {"kind":"SIMPLE","text":"Error: Could not create the Java Virtual Machine.","position":{},"original":"Error: Could not create the …Run Code Online (Sandbox Code Playgroud) 我在配备2.7 GHz Intel Core i7的笔记本电脑上运行以下Java代码.我打算让它测量完成2 ^ 32次迭代循环所需的时间,我预计大约需要1.48秒(4/2.7 = 1.48).
但实际上它只需要2毫秒,而不是1.48秒.我想知道这是否是下面任何JVM优化的结果?
public static void main(String[] args)
{
long start = System.nanoTime();
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++){
}
long finish = System.nanoTime();
long d = (finish - start) / 1000000;
System.out.println("Used " + d);
}
Run Code Online (Sandbox Code Playgroud) 我想知道当你试图捕获StackOverflowError时会发生什么,并提出以下方法:
class RandomNumberGenerator {
static int cnt = 0;
public static void main(String[] args) {
try {
main(args);
} catch (StackOverflowError ignore) {
System.out.println(cnt++);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题:
为什么这个方法打印'4'?
我想也许是因为System.out.println()在调用堆栈上需要3个段,但我不知道3号来自哪里.当你查看源代码(和字节码)时System.out.println(),它通常会导致比3更多的方法调用(因此调用堆栈上的3个段是不够的).如果是因为优化热点VM应用(方法内联),我想知道其他VM上的结果是否会有所不同.
编辑:
由于输出似乎是高度JVM特定的,我使用
Java(TM)SE运行时环境(构建1.6.0_41-b02)
Java HotSpot(TM)64位服务器VM(构建20.14-b01,混合模式)得到结果4
解释为什么我认为这个问题与理解Java堆栈不同:
我的问题不是为什么有一个cnt> 0(显然是因为System.out.println()需要堆栈大小并StackOverflowError在某些东西被打印之前抛出另一个),但为什么它具有特定值4,分别为0,3,8,55或其他的其他东西系统.
Sun的规范JVM实现将一些非常复杂的优化应用于字节码,以便在代码运行几次后获得接近本机的执行速度.
问题是,为什么这个编译的代码没有缓存到磁盘上以便在后续使用同一个函数/类时使用?
就目前而言,每次执行程序时,JIT编译器都会重新启动,而不是使用预编译版本的代码.当字节码基本上被解释时,不会添加此功能会大大增加程序的初始运行时间吗?
问题不在于32位操作系统上的最大堆大小,因为32位操作系统的最大可寻址内存大小为4GB,并且JVM的最大堆大小取决于可以保留多少连续空闲内存.
我更感兴趣的是知道在64位操作系统中运行的32位JVM的最大(理论上和实际可实现的)堆大小.基本上,我正在寻找与SO相关问题中的数字类似的答案.
至于为什么使用32位JVM而不是64位JVM,原因不是技术性的,而是行政/官僚性的 - 在生产环境中安装64位JVM可能为时已晚.
使用java -cp CLASSPATH和运行Java应用程序有什么区别java -jar JAR_FILE_PATH?是否其中一个更喜欢运行Java应用程序?我的意思是JVM中哪一种方式更昂贵(根据他们的机器资源使用情况)?
哪一个会导致JVM在尝试运行应用程序时产生更多线程?
例如:
class A {
static int i=0;
static int j;
static void method() {
// static k=0; can't use static for local variables only final is permitted
// static int L;
}
}
Run Code Online (Sandbox Code Playgroud)
这些变量将存储在Java,堆中还是堆栈内存中?它们是如何存储的?