标签: java-11

Java 9:AES-GCM性能

我已经运行了一个简单的测试,通过加密循环中的字节缓冲区来测量Java 9中AES-GCM性能.结果有点令人困惑.原生(硬件)加速似乎有效 - 但并非总是如此.进一步来说,

  1. 在循环中加密1MB缓冲区时,前50秒的速度约为60 MB /秒.然后它跳到1100 MB /秒,并保持在那里.JVM是否决定在50秒后激活硬件加速(或3GB数据)?可以配置吗?我在哪里可以阅读有关新的AES-GCM实现(除了这里).
  2. 加密100MB缓冲区时,硬件加速根本没有启动.速度是平坦的60 MB /秒.

为什么?

我的测试代码如下所示:

int plen = 1024*1024;
byte[] input = new byte[plen];
for (int i=0; i < input.length; i++) { input[i] = (byte)i;}
byte[] nonce = new byte[12];
...
// Uses SunJCE provider
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
byte[] key_code = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
SecretKey key = new SecretKeySpec(key_code, "AES");
SecureRandom random = new SecureRandom();

long total = 0;
while (true) {
  random.nextBytes(nonce);
  GCMParameterSpec …
Run Code Online (Sandbox Code Playgroud)

java encryption performance aes-gcm java-11

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

在jshell-11中,为什么重置为null的重新声明的引用变量仍然具有类型?

当在第33行重新声明Integer'a'时,为什么jshell将引用变量显示为Integer的实例(参考第38和39行)?重新声明后,第34行显示'a'设置为null.当'a'在第6行声明但未给出值时,或在第22行中重置为null时,'a'不被视为Integer的实例.我希望当引用变量被重新声明时,因为它的值为null,所以它不是一个类型的实例; 然而,事实并非如此.

01: java-lava:~ cafedude$ jshell
02: |  Welcome to JShell -- Version 11
03: |  For an introduction type: /help intro
04: 
05: jshell> Integer a;
06: a ==> null
07: |  created variable a : Integer
08: 
09: jshell> a instanceof Integer;
10: $2 ==> false
11: |  created scratch variable $2 : boolean
12: 
13: jshell> a = 1;
14: a ==> 1
15: |  assigned to a : Integer
16: 
17: jshell> a instanceof Integer;
18: …
Run Code Online (Sandbox Code Playgroud)

java instanceof jshell java-11

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

Intellij IDEA中的Java 11 JShell

我有Java 11 JDK和IntelliJ IDEA 2018.2.4(64位).当我使用Java 10.0.2时,IntelliJ IDEA中的JShell控制台工作正常.现在我已升级到Java 11,JShell控制台已停止工作.单击"运行"按钮或按Ctrl + Enter(参见屏幕截图)时,什么都没发生.

我的项目使用Java 11编译和运行很好 - 它只是JShell控制台不起作用.(此外,JShell在命令提示符下运行正常,它只在IDEA内部无效.)我可以在两台机器上重现这个问题,一台在家运行IDEA Community Edition 2018.2.4,另一台在运行Ultimate 2018.2的工作0.3.

我需要做一些配置来解决这个问题吗?

截图

java intellij-idea jshell java-11

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

Java 11 + Chrome/Firefox = TLS解密错误

我目前正在将一些服务器软件从Java 8迁移到Java 11.除了当我的服务器在Java 11(并且只有11)上运行时拒绝TLS连接这一事实以外,一切正常.即,当运行到Java 10时,一切正常.一旦切换到Java 11(当然绝对没有代码更改)我得到TLS解密错误.我的应用程序工作正常,否则我禁用SSL/TLS或当我使用IE/Edge连接到我的服务器(通过TLS).使用Chrome 70或Firefox 62时,我分别得到ERR_SSL_PROTOCOL_ERRORSEC_ERROR_BAD_SIGNATURE.

我尝试使用WireShark进行分析(请参阅我的转储).我的结论是Java 11和Chrome/Firefox协商了一个糟糕的密码套件(rsa_pss_rsae_sha256),它在某种程度上不适用于Java 11. Java 8和IE/Edge似乎协商了一个不同的密码套件(rsa_pkcs1_sha256),这是有效的.

有人知道如何解决这个问题或者至少解决这个问题(当然除了禁用SSL/TLS或使用IE/Edge之外)?提前致谢.

java ssl java-11

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

LogManager.getLogger()无法确定Java 11上的类名

我正在使用带有Java 11的log4j2(2.11.1)并尝试Logger使用以下命令获取对象:

private static final Logger LOG = LogManager.getLogger();
Run Code Online (Sandbox Code Playgroud)

(从进口log4j-apiorg.apache.logging.log4j)

在运行时,我收到以下错误:

WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance.
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.UnsupportedOperationException: No class provided, and an appropriate one cannot be found.
at 
org.apache.logging.log4j.LogManager.callerClass(LogManager.java:555)
    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:580)
    at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:567)
    at app.App.<clinit>(App.java:11)
Run Code Online (Sandbox Code Playgroud)

哪个有意义 - 不支持getCallerClass,因此记录器无法确定类名.

它应该以这种方式工作吗?当然,我不必将类名硬编码到每个记录器中?

java log4j2 java-11

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

Java 11与Java 8中的拖放工作方式不同

我编写了一个程序,它使用了javafx中的拖放功能.在JavaFX8中它完美运行.

在JavaFX11中,拖放功能失效:我没有得到一个不同的鼠标光标,我没有得到我正在拖动的行的鬼图像,并且滴有些错误 - 它们不会触发鼠标释放,然后每次我点击表格时触发掉落.

这是最小的可运行示例,它演示了我面临的问题.在Java 8 JVM上运行它可以根据需要运行.在Java 11 JVM上它没有.我在Ubuntu 18.04上.

我很好地改变我的代码以适应Java 11,但我不知道我做错了什么.

Java 11版

java version "11.0.1" 2018-10-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.1+13-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.1+13-LTS, mixed mode)
Run Code Online (Sandbox Code Playgroud)

Java 8版

openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-8u181-b13-1ubuntu0.18.04.1-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
Run Code Online (Sandbox Code Playgroud)

DND11.java

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DataFormat;
import javafx.scene.input.Dragboard;
import javafx.scene.input.TransferMode;
import …
Run Code Online (Sandbox Code Playgroud)

migration javafx java-8 javafx-8 java-11

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

使用匿名参数化类类型推断的javac NPE时,JDK 11.0.2编译失败

代码(spring-web 5.1.2)

public static void main(String[] args) {
    RestTemplate restTemplate = new RestTemplate();

    HttpHeaders headers = new HttpHeaders();
    headers.set(HttpHeaders.AUTHORIZATION, "token");
    HttpEntity<Object> requestEntity = new HttpEntity<>(headers);

    ResponseEntity<Object> test = restTemplate.exchange(
            "https://example.com",
            HttpMethod.GET,
            new HttpEntity<>(headers),
            new ParameterizedTypeReference<>() { // fails here
            });
}
Run Code Online (Sandbox Code Playgroud)

OracleJDK 1.8(预期输出)

无法推断org.springframework.core.ParameterizedTypeReference的类型参数

原因:不能对匿名内部类使用“ <>”

OracleJDK 11.0.2(非预期输出)

编译器消息文件损坏:key = compiler.misc.msg.bug arguments = 11.0.2,{1},{2},{3},{4},{5},{6},{7} java.lang jdk.compiler / com.sun.tools.javac.comp.Flow $ FlowAnalyzer.visitApply(Flow.java:1235)处的.NullPointerException,jdk.compiler / com.sun.tools.javac.tree.JCTree $ JCMethodInvocation.accept( JcTree.java:1634),位于jdk.compiler / com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49),位于jdk.compiler / com.sun.tools.javac.comp.Flow $ BaseAnalyzer。在jdk.compiler / com.sun.tools.javac.comp.Flow $ FlowAnalyzer.visitVarDef(Flow.java:989)处扫描(Flow.java:398)
...

如果我将菱形运算符更改为显式类型 …

java type-inference javac compiler-bug java-11

12
推荐指数
4
解决办法
2777
查看次数

Java 8和Java 11之间的反序列化行为不同

我在Java 11中反序列化存在问题,导致HashMap无法找到密钥。如果对这个问题有更多了解的任何人都可以说我建议的解决方法看起来还可以,或者我可以做得更好,我将不胜感激。

考虑以下人为设计的实现(实际问题中的关系稍微复杂一些,很难更改):

public class Element implements Serializable {
    private static long serialVersionUID = 1L;

    private final int id;
    private final Map<Element, Integer> idFromElement = new HashMap<>();

    public Element(int id) {
        this.id = id;
    }

    public void addAll(Collection<Element> elements) {
        elements.forEach(e -> idFromElement.put(e, e.id));
    }

    public Integer idFrom(Element element) {
        return idFromElement.get(element);
    }

    @Override
    public int hashCode() {
        return id;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof …
Run Code Online (Sandbox Code Playgroud)

java serialization deserialization java-8 java-11

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

在 Visual Studio Code (VsCode) 和 Java 11 中使用 SonarLint 时出错

我在 Visual Studio 代码中使用 SonarLint 时遇到问题,我 \xe2\x80\x99 在 java 8 中一直很好地使用这个插件,但上周,Vscode 需要 java 11 作为最低 java 版本,当我更新它时(我继续使用 java对于我的项目来说,根据Vscode可以使用两个版本),插件无法\xe2\x80\x99启动良好,这是一个错误:\n[Error - 16:57:02.682] Analysis failed.

\n

[错误 - 16:57:02.683] java.lang.IllegalStateException:没有匹配 'C:\\Users\\MyUser.m2\\repository\\com\\sun\\java\\tools\\11\ 的文件或目录\tools-11.jar'

\n

我知道tools.jar在java 11中不存在\xe2\x80\x99t,并且我无法\xe2\x80\x99t找到一个jar来替换它或解决这个问题的方法。\nI\xe2\x80\x99m使用最后一个sonarLint 插件版本 1.17.0

\n

感谢您的回答。

\n

java visual-studio-code sonarlint java-11

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

Android + coreLibraryDesugaring:我可以使用哪些 Java 11 API?

我正在尝试将一些 Java 库从“普通”JVM 迁移到 android,并坚持使用代码中使用的一些 Java11 API。

我已经得到的第一件事 - Java11 语言功能似乎仅适用于 Android Studio 的 Canary 版本,请参阅此处的答案

现在我需要了解哪些 API 可以真正使用。这里有两个对我不起作用的用例,如果我做错了什么或者它永远不应该起作用,我就无法得到:

  1. List.copyOf()- Java11中引入,该方法copyOf在android上不可用。Java 9 中引入的“List.of()”方法可以正常工作。

  2. class java.lang.invoke.LambdaMetafactory- 随 Java 1.8 引入 - 用于以编程方式创建 lambda 以供使用,而不是用于反射,在 Android 上不可见。

我在这里的来源中看到了它们desugar_jdk_libs

所以 - 问题是:我如何确定某些 Java API 是否应该在“脱糖”android 版本中可用?“脱糖”到底能带来什么?

重现步骤:

  1. 使用Android Studio Canary生成一个虚拟的“Basic Activity”项目
  2. 确保以下内容中提供build.gradle
android {
    compileOptions {
        coreLibraryDesugaringEnabled true
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
}
dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
} …
Run Code Online (Sandbox Code Playgroud)

android java-11

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