【JDK】【03】JDK1.7升级到1.8

1.metaspace代替permsize

JDK8中用metaspace代替permsize,因此在许多我们设置permsize大小的地方同样需要修改配置为metaspace
将-XX:PermSize=256m;-XX:MaxPermSize=256m;
修改为:-XX:MetaspaceSize=256m;-XX:MaxMetaspaceSize=256m;

2.Unsupported major.minor version 52.0

本地jdk版本太低,不支持这个高级版本jdk1.8编译过的项运行。

3.jdk1.8发行说明

最近版本是JDK 8u241
https://www.oracle.com/technetwork/java/javase/documentation/8u-relnotes-2225394.html

4.jdk1.8新增内容

https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html

5.官方升级建议

https://www.oracle.com/technetwork/java/javase/jdk8-adoption-guide-2157601.html

https://www.oracle.com/technetwork/java/javase/8-compatibility-guide-2156366.html#A999198

6.部分建议

开发查看是否使用了BigDecimal.stripTrailingZeros()
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6480539
在Java SE 8之前,当BigDecimal.stripTrailingZeros调用数值为零的值时,它将返回该值。现在,该方法将返回常量BigDecimal.ZERO。 
   
package com.yinzhen.jdk;
 
import java.math.BigDecimal;
 
public class JDK8MathDemo {
 
    public static void main(String[] args) {
        BigDecimal dec = new BigDecimal("2.00000");
        //BigDecimal dec = new BigDecimal("0.00000");
        System.out.print("Starting decimal = " + dec.toPlainString());
        System.out.println(" scale = " + dec.scale());
        dec = dec.stripTrailingZeros();
        System.out.print("Ending decimal = " + dec.toPlainString());
        System.out.println(" scale = " + dec.scale());
 
         
        /**
         * jdk1.7
         * Starting decimal = 0.00000 scale = 5
           Ending decimal = 0.00000 scale = 5
            
           Starting decimal = 2.00000 scale = 5
           Ending decimal = 2 scale = 0
         */
         
       /**
        * jdk1.8
        * Starting decimal = 0.00000 scale = 5
          Ending decimal = 0 scale = 0
          Starting decimal = 2.00000 scale = 5
          Ending decimal = 2 scale = 0
 
        */
    }
 
}
使用-XX:MetaspaceSize=256m;-XX:MaxMetaspaceSize=256m替换PermSize、MaxPermSize
HotSpot / gc 概要命令行标志PermSize和MaxPermSize已被删除并被忽略。如果在命令行上使用,将为每个警告发出警告。 
Java HotSpot(TM)服务器VM警告:忽略选项PermSize = 32m;支持在8.0中被删除
Java HotSpot(TM)服务器VM警告:忽略选项MaxPermSize = 128m;支持在8.0中被删除
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=7131459
 
使用NumberFormat和DecimalFormat类时,在某些特殊情况下,JDK早期版本的舍入行为是错误的。
当format()使用非常接近平局的值调用方法时,会发生此错误行为,其中由NumberFormat或DecimalFormat实例的模式指定的舍入位置正好位于平局的位置。
在这种情况下,会发生错误的双舍入或错误的非舍入行为。
例如,当使用默认的建议NumberFormatFormatAPI形式:NumberFormat nf = java.text.NumberFormat.getInstance()后跟时nf.format(0.8055d),
该值0.8055d会记录在计算机中,0.80549999999999999378275106209912337362766265869140625因为此值无法精确地以二进制格式表示。
在这里,默认的舍入规则是“ half-even”,并且format()在JDK 7 中调用的结果是错误的输出“ 0.806”,而正确的结果是“ 0.805”,因为计算机记录在内存中的值在“以下”领带。
对于程序员可能选择的任何模式(非默认模式)可能定义的所有舍入位置,都将实现此新行为。
 
package com.yinzhen.jdk;
 
import java.text.NumberFormat;
 
public class JDK8NumberFormat {
     
    public static void main(String[] args) {
        double[] myDoubles  = {0.8055d,1.1015d,1.1835d};
        NumberFormat nf = NumberFormat.getInstance(); // or NumberFormat.getCurrencyInstance()
        for(double myDouble:myDoubles) {
            System.out.println(nf.format(myDouble));
        }  
         
         
        /**
         * jdk1.7
         * 0.806
           1.102
           1.184
         */
         
        /**
         * jdk1.8
         * 0.805
           1.101
           1.183
         */
    }
     
 
}
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4802647
在早期版本中,如果集合本身为空,则Collection.removeAll(Collection)和的某些实现retainAll(Collection)将静默忽略null参数。
从此发行版开始,NullPointerException如果将null作为参数提供,则集合将始终抛出a 。
 
package com.yinzhen.jdk;
 
import java.util.ArrayList;
import java.util.List;
 
public class JDK8Collections {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("test");
        list.removeAll(null);
         
        /**
         * jdk1.7
         * 不报错
         */
         
        /**
         * jdk1.8
         * Exception in thread "main" java.lang.NullPointerException
            at java.util.Objects.requireNonNull(Objects.java:203)
            at java.util.ArrayList.removeAll(ArrayList.java:693)
            at com.yinzhen.jdk.JDK8Collections.main(JDK8Collections.java:10)
         */
    }
 
}
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8001319
如果项目中使用了java.security.SecurityPermission insertProvider
替换成Security.addProvider
 
该java.security.SecurityPermission insertProvider.{provider name}目标名称的进一步使用气馁,
因为它可以通过重写来规避名称限制java.security.Provider.getName方法。
同样,与授予代码权限以插入具有特定名称或它选择的任何名称的提供程序有关的风险也相当。
 
使用代替
新的insertProvider目标名称。与现有政策文件的兼容性一直保存着,
作为新旧和权限将被检查Security.addProvider和insertProviderAt方法。
没有验证成功
密钥长度是确定基于公共密钥的加密算法强度的重要安全参数。少于1024位的RSA密钥被认为是可破坏的。
 
在此更新中,如果证书包含长度小于1024位的RSA密钥,则证书将被阻止。
此限制是通过Java安全性属性来应用的jdk.certpath.disabledAlgorithms。
这会影响遵循此安全性属性的提供程序,例如Sun提供程序和SunJSSE提供程序。
安全属性,jdk.certpath.disabledAlgorithms还涵盖了TLS中使用的静态密钥(X.509证书中的密钥)的使用。
 
有了此密钥大小限制,使用基于少于1024位的RSA密钥的X.509证书的用户将遇到认证路径构建和验证的兼容性问题。
此密钥大小限制还影响验证X.509证书的JDK组件,例如签名的JAR验证,SSL / TLS传输和HTTPS连接。
 
为了避免兼容性问题,建议使用RSA密钥小于1024位的X.509证书的用户使用更强的密钥更新其证书。
作为一种解决方法,用户可以自行承担风险,调整密钥大小限制安全属性(jdk.certpath.disabledAlgorithms)以允许使用较小的密钥大小。
 
https://blog.csdn.net/huiyanshizhen21/article/details/105102924
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值