首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JDK 从老版本升级到 1.8的问题总结

JDK 从老版本升级到 1.8的问题总结

作者头像
Java宝典
发布于 2021-01-14 06:53:26
发布于 2021-01-14 06:53:26
3.8K00
代码可运行
举报
运行总次数:0
代码可运行

JDK8 升级常见问题

JDK8 发布很久了,它提供了许多吸引人的新特性,能够提高编程效率。 如果是新的项目,使用 JDK8 当然是最好的选择。但是,对于一些老的项目,升级到 JDK8 则存在一些兼容性问题,是否升级需要酌情考虑。 近期,我在工作中遇到一个任务,将部门所有项目的 JDK 版本升级到 1.8 (老版本大多是 1.6)。在这个过程中,遇到一些问题点,并结合在网上看到的坑,在这里总结一下。

Intellij 中的 JDK 环境设置

Settings

点击 File > Settings > Java Compiler

Project bytecode version 选择 1.8

点击 File > Settings > Build Tools > Maven > Importing

选择 JDK for importer 为 1.8

Projcet Settings

Project SDK 选择 1.8

Application

如果 web 应用的启动方式为 Application ,需要修改 JRE

点击 Run/Debug Configurations > Configuration

选择 JRE 为 1.8

Linux 环境修改

修改环境变量

修改 /etc/profile 中的 JAVA_HOME,设置 为 jdk8 所在路径。

修改后,执行 source /etc/profile 生效。

检查环境变量是否添加成功测试:

echo $JAVA_HOME

编译、发布脚本中如果有 export JAVA_HOME ,需要注意,需要使用 jdk8 的路径。

修改 maven

settings.xml 中 profile 的激活条件如果是 jdk,需要修改一下 jdk 版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<activation>
  <jdk>1.8</jdk> <!-- 修改为 1.8 -->
</activation>
修改 server

修改 server 中的 javac 版本,以 resin 为例:

修改 resin 配置文件中的 javac 参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<javac compiler="internal" args="-source 1.8"/>

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=

JVM 参数调整

在 jdk8 中,PermSize 相关的参数已经不被使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-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

字节码问题

ASM 5.0 beta 开始支持 JDK8

字节码错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Caused by: java.io.IOException: invalid constant type: 15
    at javassist.bytecode.ConstPool.readOne(ConstPool.java:1113)
  • 查找组件用到了 mvel,mvel 为了提高效率进行了字节码优化,正好碰上 JDK8 死穴,所以需要升级。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
  <groupId>org.mvel</groupId>
  <artifactId>mvel2</artifactId>
  <version>2.2.7.Final</version>
</dependency>
  • javassist
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
  <groupId>org.javassist</groupId>
  <artifactId>javassist</artifactId>
  <version>3.18.1-GA</version>
</dependency>

注意 有些部署工具不会删除旧版本 jar 包,所以可以尝试手动删除老版本 jar 包。

http://asm.ow2.org/history.html

Java 连接 redis 启动报错 Error redis clients jedis HostAndPort cant resolve localhost address

错误环境: 本地 window 开发环境没有问题。上到 Linux 环境,启动出现问题。 错误信息: Error redis clients jedis HostAndPort cant resolve localhost address

解决办法:

(1)查看 Linux 系统的主机名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# hostname
template

(2)查看/etc/hosts 文件中是否有 127.0.0.1 对应主机名,如果没有则添加

Resin 容器指定 JDK 1.8

如果 resin 容器原来版本低于 JDK1.8,运行 JDK 1.8 编译的 web app 时,可能会提示错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java.lang.UnsupportedClassVersionError: PR/Sort : Unsupported major.minor version 52.0

解决方法就是,使用 JDK 1.8 要重新编译一下。然后,我在部署时出现过编译后仍报错的情况,重启一下服务器后,问题解决

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
./configure --prefix=/usr/local/resin  --with-java=/usr/local/jdk1.8.0_121
make & make install

参考资料

  • java8-tutorial
  • Compatibility Guide for JDK 8
  • Compatibility Guide for JDK 8 中文翻译
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java宝典 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JDK 升级问题小结
本文介绍了在 JDK 8 中关于 JRE 的兼容性问题和解决方案,包括启动时间、类路径问题、第三方 jar 包无法使用、JVM 参数调整和类元数据空间上限等方面的问题。
静默虚空
2018/01/05
2.1K0
Java8 到 Java17 升级指南(Bug大全)
Java 8 是旧时代的 Java 6,还不快升级 。最近在做 Java8 到 Java17 的迁移工作,前期做了一些准备,过程中的一些信息记录如下(持续更新。。。)
猫头虎
2024/04/08
3490
Java8 到 Java17 升级指南(Bug大全)
Java 17 升级指南
因为有太多人公众号偷转我的掘金文章,我还是发到公众号这里吧。 Java 8 是旧时代的 Java 6,还不快升级,😄。最近在做 Java8 到 Java17 的迁移工作,前期做了一些准备,过程中的一些信息记录如下(持续更新。。。https://juejin.cn/post/7117531586232320031 ) 分为几个部分: 编译相关 参数迁移相关 运行相关 编译相关 JEP 320 在 Java11 中引入了一个提案 JEP 320: Remove the Java EE and CORBA Mod
挖坑的张师傅
2022/12/05
1.5K0
Java 17 升级指南
3个Spring Boot项目调优的方式
关于这些设置的JVM参数是什么意思,请参考第二步中的oracle官方给出的调优文档。
程序员追风
2019/09/26
4460
3个Spring Boot项目调优的方式
【RocketMq】NameServ启动脚本分析(Ver4.9.4)
最开始的mqnamesrv.sh脚本获取环境变量的部分看不懂其实没啥影响,大略有个印象即可,当然可以截取部分的命令到Linux运行测试一下就明白了,比如准备环境变量等等,最后一句话比较关键。
阿东
2023/02/22
6840
频繁GC (Allocation Failure)及young gc时间过长分析
本文主要分析一个频繁GC (Allocation Failure)及young gc时间过长的case。
code4it
2018/09/17
13.6K0
nacos集群配置
1.nacos的下载(注意nacos需要和springcloud alibaba 版本对应)
Reset
2022/12/27
1.1K0
选择JDK1.8的理由之JVM内存变化
JVM中内存通常划分为两个部分,分别为堆内存与栈内存, 栈内存主要用执行线程方法,存放本地临时变量与线程中方法执行时候需要的引用对象地址。
用户1212940
2022/04/13
6380
选择JDK1.8的理由之JVM内存变化
大量类加载器创建导致诡异FullGC
最近接手了一个同事的项目,某一天接口的响应耗时突然增加了很多,由几十ms 增加到了几十秒。
码农架构
2020/10/20
1.8K0
大量类加载器创建导致诡异FullGC
JVM - 应用JVM核心参数推荐设置
-Xss设置越小 ,说明一个线程栈里能分配的栈帧就越少,但是对JVM整体来说能开启的线程数会更多 ,当然了,线程多了并不一定性能就高,只是理论上是这样的。
小小工匠
2021/08/17
1.8K0
JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践
Tech 导读 距离 JDK 8 发布已经过去了 9 年,那么这 9 年的时间,JDK 做了哪些升级?是否有新的重大特性值得尝试?能否解决一些现在令人苦恼的问题?带着这份疑问进行了 JDK 版本的调研与升级踩坑记录,希望本文能够帮到大家。
京东技术
2023/09/11
6230
JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践
JVM设置对象直接进入年老代
1.先说明一个事情就是在jdk1.8之后已经没有永久代被元空间取代,那么元空间在哪里?
Java架构师必看
2021/07/13
8480
程序员进阶架构师必看的面试重灾区:JVM整体架构、内存模型与调优实战
这里,我们先来说说什么是VM吧,VM的中文含义为:虚拟机,指的是使用软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统,是物理机的软件实现。
冰河
2024/01/17
2540
程序员进阶架构师必看的面试重灾区:JVM整体架构、内存模型与调优实战
元空间和永久代的区别
在Java虚拟机(JVM)内部,class文件中包括类的版本、字段、方法、接口等描述信息,还有运行时常量池,用于存放编译器生成的各种字面量和符号引用。
葆宁
2019/04/18
6.1K1
元空间和永久代的区别
一张PDF了解JDK9 GC调优秘籍-附PDF下载
今天我们讲讲JDK9中的JVM GC调优参数,JDK9中JVM的参数总共有2142个,其中正式的参数有659个。好像比JDK8中的参数要少一点。
程序那些事
2020/07/08
5250
一张PDF了解JDK9 GC调优秘籍-附PDF下载
《深入理解Java虚拟机》读书笔记(三)
Java堆用于存储对象实例,只要不断的创建对象并且保证GC Roots到对象之间有可达路径来避免垃圾回收,就可以触发Java堆的内存溢出异常
DestinySkywalker
2023/01/01
5860
《深入理解Java虚拟机》读书笔记(三)
16.彻底解决Jmap在mac版本无法使用的问题
看了网上很多帖子,都说一半,说的都是大家说过的,根本没有解决问题。说jdk8不行,换成jdk9或者jdk11,我都试了,还是不行,最后说是mac的问题。换成linux,崩溃!!!
用户7798898
2021/11/11
2.2K0
16.彻底解决Jmap在mac版本无法使用的问题
Javac命令使用ct.sym文件约束可使用的类
在JDK6,升级为JDK7或者JDK8的过程中会遇到一些奇怪的问题,简单的介绍一下经典的ClassNotFound:sun.nio.*、com.sun.image.codec.jpeg.*等。
白凡
2018/08/07
2.2K0
Javac命令使用ct.sym文件约束可使用的类
谈JVM线程和内存参数合理性设置
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
京东技术
2023/08/25
2.5K0
谈JVM线程和内存参数合理性设置
18.jvm调优工具及案例分析
因为我的是mac电脑,所以运行程序都是在mac上,有时一些工具在mac上不是很好用。如果有不好用的情况,可以参考文章:
用户7798898
2021/11/19
8110
推荐阅读
相关推荐
JDK 升级问题小结
更多 >
交个朋友
加入AI趋势交流群
追踪大模型新动态 探索多模态应用场景
加入AI工作实战群
学习大模型落地案例 实操行业场景应用
加入AI学习入门群
AI入门避坑攻略 共享大咖学习笔记
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验