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

资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Thinks

Service Worker最佳实践

Service Worker是一项比较新的Web技术,是Chromium团队在吸收了ChromePackaged App的Event Page机制,同时吸取了H...

2801
来自专栏salesforce零基础学习

salesforce 零基础学习(二十)简单APP制作

本篇参考链接:https://developer.salesforce.com/trailhead/project/salesforce_developer_w...

2138
来自专栏Debian社区

Pyinotify – Linux中实时监控文件系统更改

Pyinotify 是一个简单而实用的 Python 模块,它用于通过 inotify 实时监控Linux文件系统的更改。用于在Linux中实时监控文件系统的变...

842
来自专栏mwangblog

Shell中的重定向

1343
来自专栏企鹅号快讯

三步将Mac系统默认PHP版本切换为MAMP等扩展环境中的PHP版本

平时做开发的时候大多都是在Mac系统下,开发环境用的是MAMP集成的,但是Mac系统原本就带有Apache的。这种情况下回默认使用系统自带的PHP版本,最近由于...

6779
来自专栏别先生

在公司的局域网内,组长让你在自己的虚拟机部署项目,大家等着访问测试,该怎么办???

1:首先推荐一篇博客吧(万分感谢,大佬们将非常实用的东西,以博客的形式记录下来,供我们这些菜鸟学习),关于vmware的三种链接方式,蛮全的,大家想仔细学的可以...

1905
来自专栏python爬虫实战之路

Linux/Mac安装Redis数据库

如果要安装最新的redis,需要安装Remi的软件源,官网地址:http://rpms.famillecollet.com/

893
来自专栏Java工程师日常干货

分享工作中常用的一个Git脚本前言一个自动化脚本运行结果脚本内容

在实际开发中,我们很频繁的需要从git远程仓库拉取master代码建立分支进行开发,开发完毕后,我们需要push到远程进行build、部署和测试,这里博主根据自...

1013
来自专栏GreenLeaves

Linux下Nginx实现负载均衡

关于在本地虚拟机(VMware 14)下安装Linux同时安装Nginx,请参考Nginx学习系列之搭建环境

724
来自专栏云上大文件传输

镭速2.0版本全新功能-分享下载

镭速2.0版本即将发布,在这里给大家介绍2.0版本新增的两个重要功能,“分享下载”和“邀请上传”。

37910

扫码关注云+社区