基于围绕这个问题的答案的讨论,我发现了Java Hotspot优化器的一个非常奇怪的行为.观察到的行为至少可以在Oracle VM 1.7.0_17中看到,但似乎也出现在较旧的Java 6版本中.
首先,我已经意识到优化器显然意识到标准API中的某些方法是不变的并且没有副作用.执行类似循环时double x=0.5; for(double d = 0; d < Math.sin(x); d += 0.001);
,Math.sin(x)
不会为每次迭代计算表达式,但优化程序会意识到该方法Math.sin
没有相关的副作用,并且结果是不变的,只要x
在循环中没有修改.
现在我注意到,只需x
从0.5 更改为1.0就禁用了此优化.进一步的测试表明,只有当abs(x)<asin(1/sqrt(2))时才能启用优化.有没有充分的理由,我没有看到,或者是对优化条件的不必要的限制?
编辑:优化似乎在hotspot/src/share/vm/opto/subnode.cpp中实现
编译以下界面:
package test;
public interface MyInterface {
public void foo();
}
Run Code Online (Sandbox Code Playgroud)
并使用javap -v -s test.MyInterface
以下方法检查已编译的代码(-s
打印成员签名):
Compiled from "MyInterface.java"
public interface test.MyInterface
SourceFile: "MyInterface.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
#1 = Class #7 // test/MyInterface
#2 = Class #8 // java/lang/Object
#3 = Utf8 foo
#4 = Utf8 ()V
#5 = Utf8 SourceFile
#6 = Utf8 MyInterface.java
#7 = Utf8 test/MyInterface
#8 = Utf8 java/lang/Object
{
public abstract void foo(); …
Run Code Online (Sandbox Code Playgroud) 我很好奇从"MemoryUsage"类中查询值时"已提交"内存的确切含义.该类将其解释为"已提交表示保证可供Java虚拟机使用的内存量(以字节为单位)." 这是否意味着内存正在被jvm进程使用,并且在java进程释放之前不可用于其他进程,或者它是否意味着如果java进程尝试分配高达该内存量,则该进程将成功?我意识到这可能是特定于实现的,但我只对hotspot感兴趣.
我有一个当前在Windows shell下运行的java进程.
其中一个负责序列化的线程被无限期阻塞,因此存储在内存中的重要信息不再被写入磁盘.
如果我关闭该过程,信息将丢失.
如果我可以编写和编译一些新代码并让它在相同的内存空间中执行以便在关闭进程之前可以再次序列化所述信息将会很方便.
该过程是使用java -jar
命令启动的.
有了热点虚拟机功能,有什么方法可以实现这一点吗?
我正在构建一个可以在移动设备和Wi-Fi设备之间传输数据的应用程序......移动设备已启用AP(通过代码),另一台设备连接到此特定网络...如何通过代码检测到查看连接到网络(AP)的设备的详细信息?**是否有解决方案?
我在HTC Desire中看到了一个名为Wifi Hot spot的应用程序,它具有显示连接到网络的设备的IP地址的功能.怎么能实现这一目标?
查看评论:HTC EVO 4G上的Sprint Mobile Hotspot.
它显示了一个可以实际显示已连接用户的应用程序.我们怎么能以编程方式做到这一点?那有API吗?
用于创建接入点:
private void createWifiAccessPoint() {
if (wifiManager.isWifiEnabled())
{
wifiManager.setWifiEnabled(false);
}
Method[] wmMethods = wifiManager.getClass().getDeclaredMethods(); //Get all declared methods in WifiManager class
boolean methodFound = false;
for (Method method: wmMethods){
if (method.getName().equals("setWifiApEnabled")){
methodFound = true;
WifiConfiguration netConfig = new WifiConfiguration();
netConfig.SSID = "\""+ssid+"\"";
netConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
//netConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
//netConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
//netConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
//netConfig.preSharedKey = password;
//netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
//netConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
//netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
//netConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
try {
boolean apstatus = (Boolean) method.invoke(wifiManager, netConfig,true); …
Run Code Online (Sandbox Code Playgroud) 我有一个Hotspot JVM堆转储,我试图找出一个对象是否在权属空间,伊甸园空间或幸存者空间中存在,但我不能.
感谢有人可以帮助我.
我想知道我的HotSpot Java的无参数调用是否使用-client,-server或分层编译选项运行.当我没有提供VM参数时,默认选择哪一个?有没有办法输出关于哪个JIT编译器正在运行的诊断?
给出以下代码:
public class Test{
static int[] big = new int [10000];
public static void main(String[] args){
long time;
for (int i = 0; i < 16; i++){
time = System.nanoTime();
getTimes();
System.out.println(System.nanoTime() - time);
}
}
public static void getTimes(){
int d;
for (int i = 0; i < 10000; i++){
d = big[i];
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出显示持续时间递减趋势:
171918
167213
165930
165502
164647
165075
203991
70563
45759
43193
45759
44476
45759
52601
47897
48325
Run Code Online (Sandbox Code Playgroud)
为什么getTimes
在执行8次或更多次后,在不到三分之一的时间内执行相同的代码?(编辑:它并不总是发生在第8次,但从5日到10日)
当我尝试在win10中通过netbeans8.2调试openjdk9时,我收到以下错误:
"\"D:/jdk9/jdk9/build/windows-x86_64-normal-server-fastdebug/jdk/bin/java.exe\":
not in executable format: File format not recognized"
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
我按命令构建源代码"./configure -with-freetype=/cygdrive/c/freetype -enable-debug -with-target-bits=64"
,然后运行make all
,但我也试过slowdebug
,但也失败了.
如果我"运行"项目而不是"debug",它会像下面那样成功运行,因此文件没有问题windows-x86_64-normal-server-fastdebug/jdk/bin/java.exe
,似乎gdb
无法识别java.exe
文件.
我也打开了openjdk
源代码的位置D:/jdk9/jdk/common/nb_native
的netbeans
,见下图:
netbeans
然而,尝试构建它,它会产生以下错误:
cd 'D:\jdk9\jdk\common'
sh ../configure --with-freetype=/cygdrive/c/freetype --with-debug-level=slowdebug --with-target-bits=64
/cygdrive/d/jdk9/jdk/configure: /cygdrive/d/jdk9/jdk/common/autoconf/configure: No such file or directory
PRE-BUILD FAILED (exit value 1, total time: 743ms)
Run Code Online (Sandbox Code Playgroud)
我知道这两个路径/cygdrive/d/jdk9/jdk/configure
和/cygdrive/d/jdk9/jdk/common/autoconf/configure
存在.
查看 UTF8 解码性能,我注意到 protobuf 的性能UnsafeProcessor::decodeUtf8
优于String(byte[] bytes, int offset, int length, Charset charset)
以下非 ascii 字符串:"Quizdeltagerne spiste jordb\xc3\xa6r med fl\xc3\x98de, mens cirkusklovnen"
。
我试图找出原因,所以我复制了相关代码,String
并将数组访问替换为不安全的数组访问,与 相同UnsafeProcessor::decodeUtf8
。\n以下是 JMH 基准测试结果:
Benchmark Mode Cnt Score Error Units\nStringBenchmark.safeDecoding avgt 10 127.107 \xc2\xb1 3.642 ns/op\nStringBenchmark.unsafeDecoding avgt 10 100.915 \xc2\xb1 4.090 ns/op\n
Run Code Online (Sandbox Code Playgroud)\n我认为差异是由于缺少边界检查消除而导致的,特别是因为checkBoundsOffCount(offset, length, bytes.length)
在String(byte[] bytes, int offset, int length, Charset charset)
.
这个问题真的是缺少边界检查消除吗?
\n这是我使用 OpenJDK 17 和 JMH 进行基准测试的代码。请注意,这只是String(byte[] bytes, …
performance jit jvm-hotspot bounds-check-elimination protobuf-java
jvm-hotspot ×10
java ×8
jit ×3
jvm ×3
optimization ×2
android ×1
bytecode ×1
gdb ×1
heap-dump ×1
interface ×1
memory ×1
performance ×1
wifi ×1