相关疑难解决方法(0)

Java编译器优化

最近,我正在读这篇文章.

根据那篇文章,Java Compiler即javac在生成字节码时不执行任何优化.这是真的吗?如果是这样,那么它可以作为中间代码生成器实现,以消除冗余并生成最佳代码吗?

java optimization javac

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

尝试用资源引入无法访问的字节码

javac是否有可能为以下过程生成无法访问的字节码?

public void ex06(String name) throws Exception {
    File config = new File(name);
    try (FileOutputStream fos = new FileOutputStream(config);
            PrintWriter writer = new PrintWriter(new OutputStreamWriter(
                    fos , "rw"))) {
        bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我查看字节码的异常表(javap -v)时,有以下条目看起来很奇怪:

43    48    86   Class java/lang/Throwable
43    48    95   any
Run Code Online (Sandbox Code Playgroud)

21   135   170   Class java/lang/Throwable
21   135   179   any
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果捕获了类型为"any"而不是Throwable的异常,则只能访问某些代码.有没有可能发生这种情况的情况?

======编辑======感谢目前为止的答案.让我给出另一个证据来表明我真的不理解异常处理:考虑以下过程

Object constraintsLock;
private String[] constraints;
private String constraint;
public void fp01() {
    // Add this constraint to the set for our web application
    synchronized (constraintsLock) …
Run Code Online (Sandbox Code Playgroud)

java jvm exception-handling javac try-catch

17
推荐指数
1
解决办法
1343
查看次数

Java 10:针对增强的循环的字节代码生成

以下示例描述了在Java 9之前生成以下代码行.

List data = new ArrayList<>();for (String b : data); 

public class Test

{
  public Test() {}
  public static void main(String[] paramArrayOfString) throws IOException {
    ArrayList localArrayList = new ArrayList();
    String str;
    for (Iterator localIterator = localArrayList.iterator(); localIterator.hasNext(); str = (String)localIterator.next()) {}
}
Run Code Online (Sandbox Code Playgroud)

在Java 10中,迭代器变量在for循环外部声明,并在操作结束后立即初始化为null值,因此GC可以清除未使用的内存.

{
    Iterator iterator = data.iterator();
    for (; iterator.hasNext();) 
    {
        String b = (String)iterator.next();
    }
    b = null;
    iterator = null;
}
Run Code Online (Sandbox Code Playgroud)

在for循环结束时,如何设置引用null明显优于引用超出范围.

资料来源:https://dzone.com/articles/features-in-java-10

此外,从评论中添加链接:https://bugs.openjdk.java.net/browse/JDK-8192858

java javac

9
推荐指数
1
解决办法
336
查看次数

私有方法内联

在Scala 不可变向量代码中有一条注释说:

原则上,大多数成员应该是私人的.但是,必须谨慎选择访问权限,以防止方法内联

  1. 私人对内联决策的影响是什么?
  2. 这也适用于Java吗?

java jvm scala inline

5
推荐指数
2
解决办法
392
查看次数

为什么来自类的java字节码出现了新的静态内部类的代码出现jvm指令ACONST_NULL

我尝试新建一个内部静态类,但我发现字节码出现 jvm 指令ACONST_NULLbwteen NEWDUP并且INVOKE_SPECIAL,但我知道一个类 new 是

  • 新的
  • DUP
  • INVOKE_SPECIAL
package com.hoho.api;

/**
 * @author linuxea
 */
public class Main {

    private static class InnerMain {
        // no field
    }

    public static void main(String[] args) {
        InnerMain innerMain = new InnerMain();
    }

}

Run Code Online (Sandbox Code Playgroud)
// class version 52.0 (52)
// access flags 0x21
public class com/hoho/api/Main {

  // compiled from: Main.java
  // access flags 0xA
  private static INNERCLASS com/hoho/api/Main$InnerMain com/hoho/api/Main InnerMain
  // access flags 0x1008 …
Run Code Online (Sandbox Code Playgroud)

java jvm bytecode jvm-bytecode

2
推荐指数
1
解决办法
115
查看次数