JDK升級問題小結
JDK8 釋出很久了,它提供了許多吸引人的新特性,能夠提高程式設計效率。
如果是新的專案,使用 JDK8 當然是最好的選擇。但是,對於一些老的專案,升級到 JDK8 則存在一些相容性問題,是否升級需要酌情考慮。
近期,我在工作中遇到一個任務,將部門所有專案的 JDK 版本升級到 1.8 (老版本大多是 1.6)。在這個過程中,遇到一些問題點,並結合在網上看到的坑,在這裡總結一下。
FAQ
sun.* 包缺失問題
JDK8 不再提供 sun.*
包供開發者使用,因為這些介面不是公共介面,不能保證在所有 Java 相容的平臺上工作。
使用了這些 API 的程式如果要升級到 JDK 1.8 需要尋求替代方案。
雖然,也可以自己匯入包含 sun.*
介面 jar 包到 classpath 目錄,但這不是一個好的做法。
需要詳細瞭解為什麼不要使用 sun.*
,可以參考官方文件:Why Developers Should Not Write Programs That Call `sun` Packages
預設安全策略修改
升級後估計有些小夥伴在使用不安全演算法時可能會發生錯誤,so,支援不安全演算法還是有必要的
找到$JAVA_HOME下 jre/lib/security/java.security
,將禁用的演算法設定為空:jdk.certpath.disabledAlgorithms=
。
第三方jar包無法使用
有些第三方 jar 包基於非 JDK8 版本編譯,可能會存在相容性問題。
這種情況只能具體問題具體分析,下面列舉幾個常用 jar 包。
- 查詢元件用到了 mvel,mvel 為了提高效率進行了位元組碼優化,正好碰上 JDK8 死穴,所以需要升級。
<dependency>
<groupId>org.mvel</groupId>
<artifactId>mvel2</artifactId>
<version>2.2.7.Final</version>
</dependency>
- javassist
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.1-GA</version>
</dependency>
注意
有些部署工具不會刪除舊版本 jar 包,所以可以嘗試手動刪除老版本 jar 包。
JVM引數調整
在jdk8中,PermSize相關的引數已經不被使用:
-XX:MaxPermSize=size
Sets the maximum permanent generation space size (in bytes). This option was deprecated in JDK 8, and superseded by the -XX:MaxMetaspaceSize option.
-XX:PermSize=size
Sets the space (in bytes) allocated to the permanent generation that triggers a garbage collection if it is exceeded. This option was deprecated un JDK 8, and superseded by the -XX:MetaspaceSize option.
JDK8 中再也沒有 PermGen
了。其中的某些部分,如被 intern 的字串,在 JDK7 中已經移到了普通堆裡。其餘結構在 JDK8 中會被移到稱作“Metaspace”的本機記憶體區中,該區域在預設情況下會自動生長,也會被垃圾回收。它有兩個標記:MetaspaceSize 和 MaxMetaspaceSize。
-XX:MetaspaceSize=size
Sets the size of the allocated class metadata space that will trigger a garbage collection the first time it is exceeded. This threshold for a garbage collection is increased or decreased depending on the amount of metadata used. The default size depends on the platform.
-XX:MaxMetaspaceSize=size
Sets the maximum amount of native memory that can be allocated for class metadata. By default, the size is not limited. The amount of metadata for an application depends on the application itself, other running applications, and the amount of memory available on the system.
以下示例顯示如何將類類後設資料的上限設定為 256 MB:
XX:MaxMetaspaceSize=256m
資料
- Compatibility Guide for JDK 8
- Compatibility Guide for JDK 8 中文翻譯
- Why Developers Should Not Write Programs That Call `sun` Packages
相關文章
- XCode 10 升級問題總結XCode
- 升級 node18 遇到的問題總結
- python升級後帶來的幾個小問題Python
- expdp/impdp跨版本升級遷移問題總結
- WAS JDK升級實施方案JDK
- jdk 升級引發bugJDK
- Oracle 10g升級psu的兩個小問題Oracle 10g
- ReactNative升級0.56.0注意問題React
- ASP.NET1.0升級ASP.NET2.0問題總結ASP.NET
- 升級JDK8的坎坷之路JDK
- linux中升級jdk的方法LinuxJDK
- jdk8 升級 jdk17 docker 部署失敗JDKDocker
- Centos 7 上安裝 jdk 及問題小記CentOSJDK
- jdk1.6升級jdk1.8踩出的神坑JDK
- Nuxt升級2.0.0時出現的問題UX
- Flutter使用TabBar問題小結FluttertabBar
- MIUI8開發版升級常見問題彙總 MIUI8開發版升級問題解答UI
- 升級win10系統後凍結bug問題的解決方法Win10
- 生產升級JDK 17 必讀手冊JDK
- Centos6.7安裝Pycharm及升級JDKCentOSPyCharmJDK
- JDK7的平行計算功能升級JDK
- JDK11升級JDK17最全實踐乾貨來了JDK
- Angular CLI 升級 6.0 之後遇到的問題Angular
- React Native SDK 升級問題及分包方案React Native
- chorme自動升級導致跨域問題ORM跨域
- Oracle 12c升級檢查問題分析Oracle
- 資料升級到5.1所遇到的問題
- 資料庫升級問題處理一則資料庫
- SUSE配置HANA出現需要升級gcc問題GC
- iOS12測試版升級常見問題 iOS12值得升級嗎?iOS
- react-router 升級小記React
- PHP問題總結:PHP最佳化及高效提速問題小結(轉)PHP
- Swift3.0專案升級到4.2遇到問題Swift
- Laravel 5.5.* 升級到 5.7.* 問題記錄Laravel
- MySQL8升級遇到的各式各樣問題MySql
- xcode升級導致cocoapods很多奇葩問題XCode
- XP升級至Windows7的問題彙總Windows
- HP UNIX - oracle rac 10.2.0.3 升級10.2.0.4問題Oracle