标签: jvm-hotspot

Hotspot循环条件优化器的奇怪行为

基于围绕这个问题的答案的讨论,我发现了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中实现

java optimization jvm-hotspot

13
推荐指数
1
解决办法
342
查看次数

在接口的常量池中包含java.lang.Object的目的是什么?

编译以下界面:

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)

java jvm bytecode interface jvm-hotspot

13
推荐指数
1
解决办法
373
查看次数

java中已提交内存的确切状态

我很好奇从"MemoryUsage"类中查询值时"已提交"内存的确切含义.该类将其解释为"已提交表示保证可供Java虚拟机使用的内存量(以字节为单位)." 这是否意味着内存正在被jvm进程使用,并且在java进程释放之前不可用于其他进程,或者它是否意味着如果java进程尝试分配高达该内存量,则该进程将成功?我意识到这可能是特定于实现的,但我只对hotspot感兴趣.

java memory jvm-hotspot

12
推荐指数
1
解决办法
1万
查看次数

在现有的jvm进程中执行新的java代码

我有一个当前在Windows shell下运行的java进程.

其中一个负责序列化的线程被无限期阻塞,因此存储在内存中的重要信息不再被写入磁盘.

如果我关闭该过程,信息将丢失.

如果我可以编写和编译一些新代码并让它在相同的内存空间中执行以便在关闭进程之前可以再次序列化所述信息将会很方便.

该过程是使用java -jar命令启动的.

有了热点虚拟机功能,有什么方法可以实现这一点吗?

java jvm-hotspot

12
推荐指数
1
解决办法
2137
查看次数

Android应用程序Wi-Fi设备 - AP连接

我正在构建一个可以在移动设备和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)

java android network-programming jvm-hotspot wifi

12
推荐指数
2
解决办法
2万
查看次数

如何从堆转储中了解Java对象是否处于tenure或eden空间中

我有一个Hotspot JVM堆转储,我试图找出一个对象是否在权属空间,伊甸园空间或幸存者空间中存在,但我不能.

感谢有人可以帮助我.

java garbage-collection jvm-hotspot heap-dump

11
推荐指数
1
解决办法
1216
查看次数

哪个Java HotSpot JIT编译器正在运行?

我想知道我的HotSpot Java的无参数调用是否使用-client,-server或分层编译选项运行.当我没有提供VM参数时,默认选择哪一个?有没有办法输出关于哪个JIT编译器正在运行的诊断?

java jit jvm-hotspot

11
推荐指数
1
解决办法
1729
查看次数

如果重复使用相同的代码,为什么Java会更快?

给出以下代码:

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日)

java optimization jit jvm jvm-hotspot

11
推荐指数
1
解决办法
1122
查看次数

如何在win10中通过netbeans8.2调试openjdk9?

当我尝试在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_nativenetbeans,见下图: 在此输入图像描述

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存在.

这是我配置预建命令的方式: 在此输入图像描述

gdb jvm jvm-hotspot

11
推荐指数
1
解决办法
168
查看次数

String 构造函数中缺少边界检查消除?

查看 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"

\n

我试图找出原因,所以我复制了相关代码,String并将数组访问替换为不安全的数组访问,与 相同UnsafeProcessor::decodeUtf8。\n以下是 JMH 基准测试结果:

\n
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

这个问题真的是缺少边界检查消除吗?

\n

这是我使用 OpenJDK 17 和 JMH 进行基准测试的代码。请注意,这只是String(byte[] bytes, …

performance jit jvm-hotspot bounds-check-elimination protobuf-java

11
推荐指数
1
解决办法
445
查看次数