草庐IT

java - Java JVM中的指令重新排序

我正在阅读this博文。而作者说的是在多线程环境下打破String中的hashCode()。通过拥有:publicinthashCode(){inth=hash;if(h==0){intoff=offset;charval[]=value;intlen=count;for(inti=0;i改为:publicinthashCode(){if(hash==0){intoff=offset;charval[]=value;intlen=count;inth=0;for(inti=0;i作者所说,我引用:"WhatI'vedonehereistoaddanadditionalread:thes

java - java.exe、javaw.exe和jvm.dll的区别

使用java.exe、javaw.exe和jvm.dll运行应用程序(例如Eclipse)有什么区别?另外,它在性能方面有什么不同吗? 最佳答案 jvm.dll是JVM的实际Windows实现(或者更好的是,主入口点)。C或C++应用程序可以使用此DLL来运行嵌入式Java运行时,这将允许应用程序直接与JVM交互,例如如果他们想使用Java作为其GUI。java.exe是DLL的包装器,因此人们可以在不需要自定义启动器应用程序的情况下实际运行Java类。它是一个Win32控制台应用程序,因此如果exe不是从批处理文件运行,Windo

java - JVM 版本管理器

有没有RubyVersionManager等同于Java世界?我正在寻找可以让我轻松下载和安装新JVM并在它们之间切换的工具。例如:jvminstalljvmlist//willlistinstalledJVMsonmysystemjvmusejdk1.6//willswitchmyenvtojdk1.6version,etc. 最佳答案 http://www.jenv.be/将允许这种类型的控制。 关于java-JVM版本管理器,我们在StackOverflow上找到一个类似的问题:

java - 如果 JIT 正在执行字节码转换为机器指令,那么 JVM 有什么用

我真的很难理解以下内容以前我知道:编译Java程序时会生成.class文件。在那个代码中是字节的形式。然后JVM会将该字节码翻译成机器可以理解的格式。现在我看到oneofthequestionsinSOAJust-In-Time(JIT)compilerisafeatureoftherun-timeinterpreter,thatinsteadofinterpretingbytecodeeverytimeamethodisinvoked,willcompilethebytecodeintothemachinecodeinstructionsoftherunningmachine所以这里

java - 我可以强制 JVM 本地编译给定的方法吗?

我的应用启动时经常调用一个对性能至关重要的方法。最终,它会被JIT编译,但不是在解释器中运行一段时间之后。有什么方法可以告诉JVM我希望从一开始就编译此方法(无需使用-XX:CompileThreshold之类的东西调整其他内部结构)? 最佳答案 我知道的唯一方法是-Xcomp标志,但通常不建议使用。它会在所有类和方法第一次运行时强制它们立即进行JIT编译。缺点是您会在初始启动时看到性能下降(由于JITActivity增加)。此标志的另一个主要限制是它似乎禁用了JIT通常会执行的基于增量分析的优化。在标准混合模式下,JIT编译器可以

java - 方法中未使用的局部变量是否会在 JVM 中获取内存?

我在SODouninitializedprimitiveinstancevariablesusememory?中看到了这篇文章它指出“在Java中,声明一个类级别的实例变量而不初始化它是否需要内存?例如:inti;如果我不使用i=5初始化它,请使用任何内存;?”我的问题是,如果是局部变量,比如说我有一个方法foo()publicintfoo(){intx;//Writecodewhichdoesnotuse/initializex}局部变量x会不会占用内存?编辑乔恩的答案是更新:对此进行更多研究,我发现这个页面向我表明,尽管编译后的字节码暗示空间是为x分配的,但它确实可能被jvm优化掉

java - 两台机器之间的 JVM 堆复制

连接在同一个网络中运行同一个Java应用程序的两台可分离计算机如何通过在彼此之间同步它们的堆来保持相同状态的基本原则是什么?我相信Terracotta完成这项任务,但我不知道某些伪代码将如何描述其核心功能。我只是想了解这项技术。 最佳答案 TerracottaDSO通过操作类(以及JDK的类等)的字节码来工作。关于如何以及何时执行此操作的说明是Terracotta配置文件的一部分。字节码修改查找某些字节码,例如字段读取或写入或监视器进入或退出。每当出现这些指令时,就会在该位置周围添加代码,以在分布式存储中执行适当的操作。比如同步获取

jvm中的Java对象ID

在Eclipse中调试时,对象值附近会显示一个对象ID。例如:28332是session对象的ID。另一个示例:waitingfor:(id=101)显示在Debug面板中。这些ID既不是哈希码也不是System.identityHashCode。有人知道-如何获取对象的thisid? 最佳答案 我想他们内部有一个IdentityHashMap,为每个对象分配一个唯一的(但在其他方面没有意义的)整数。这应该在Eclipse调试器内部(不是对象具有的特殊id)。你是问怎么搞定的?编辑:我会像这样设置断点(注意我不熟悉Eclipse):

java - 了解最大 JVM 堆大小 - 32 位与 64 位

我有read32位Windows上的最大堆大小约为1.5GB,这是因为JVM需要连续内存。有人可以解释“连续内存”的概念以及为什么在Windows上最多只有1.5GB吗?其次,64位Windows上的最大堆大小是多少,为什么这与32位上可用的不同? 最佳答案 32位/64位部分与Java无关事实证明,32位系统中的内存位置由32位无符号整数引用。这允许多达2^32个可能的内存位置。由于每个位置存储1个字节,因此如果您愿意,您可以获得2^32个字节或4GB。在64位系统上,有2^64个位置,即16艾字节。现在,在Windows中,连续

java - (Oracle) Java JVM 如何知道闰秒正在发生?

一个leapsecondwilloccur2015年6月30日。不同的操作系统似乎以不同的方式处理这种情况。在我的特殊情况下,我们正在运行一个RedHat6.4系统,该系统带有高度依赖时间的定制Java(JDK1.7)软件。根据一些recentRedHatreleasedinformation我发现,我们系统的NTP守护进程会通过重复23:59:59两次来确保操作系统自动处理闰秒。我的问题是:如果我有一个长时间运行的JDK1.7进程,它如何知道闰秒正在发生?我的意思是,Java最终如何知道IERS人们已经决定插入闰秒?Date文档似乎表明知道闰秒,但似乎无济于事。我可以假设JDK,当构