Java 8 lambda的一个编译bug
最近利用github action向Maven中央仓库发布企业微信SDK时会失败,从日志中发现是系统资源耗尽了,日志如下:
[INFO] Changes detected - recompiling the module! :dependency
[INFO] Compiling 35 source files with javac [debug target 8] to target/classesThe system is out of resources.
Consult the following stack trace for details.
java.lang.StackOverflowErrorat com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)at com.sun.tools.javac.tree.JCTree$JCLambda.accept(JCTree.java:1624)at com.sun.tools.javac.comp.Attr.attribTree(Attr.java:576)at com.sun.tools.javac.comp.Attr.visitLambda(Attr.java:2435)…………
编译的环境是 Java 8
应该是递归引用导致OOM了,但是仔细REVIEW了代码并没有发现问题。困扰了一个多月。今天终于解决了,问题是由下面的代码引起的:
public final class WecomUserAgent {/*** 版本号*/public static final String VERSION = "1.2.4";/*** UserAgent*/public static final String WECOM_USER_AGENT= "Wecom/" + VERSION + Optional.ofNullable(System.getProperty("java.version")).map(javaVersion -> " Java/" + javaVersion).orElse("");private WecomUserAgent() {}
}
根本的原因在于上面的静态变量WECOM_USER_AGENT。
在Java 8 中,被标记final的静态属性初始化时如果在字符串拼接中使用了lambda流操作,可能导致javac递归,最终堆栈溢出。该问题在Java 9得到了修复
Bug报告:https://bugs.openjdk.org/browse/JDK-8077605
解决方法
升级JDK
升级JDK到9+ 就可以直接解决这个问题。
兼容写法
如果无法直接升级JDK,可以使用静态块来初始化:
public final class WecomUserAgent {/*** 版本号*/public static final String VERSION = "1.2.4";/*** UserAgent*/public static final String WECOM_USER_AGENT;static {WECOM_USER_AGENT = "Wecom/" + VERSION + Optional.ofNullable(System.getProperty("java.version")).map(javaVersion -> " Java/" + javaVersion).orElse("");}private WecomUserAgent() {}
}
相关文章:
Java 8 lambda的一个编译bug
最近利用github action向Maven中央仓库发布企业微信SDK时会失败,从日志中发现是系统资源耗尽了,日志如下: [INFO] Changes detected - recompiling the module! :dependency [INFO] Compiling 35 source files with javac [debug target 8] …...
无人机覆盖路径规划综述
摘要:覆盖路径规划包括找到覆盖某个目标区域的每个点的路线。近年来,无人机已被应用于涉及地形覆盖的多个应用领域,如监视、智能农业、摄影测量、灾害管理、民事安全和野火跟踪等。本文旨在探索和分析文献中与覆盖路径规划问题中使用的不同方…...
【代码随想录】算法训练计划37
贪心 1、738. 单调递增的数字 题目: 输入: n 10 输出: 9 思路: func monotoneIncreasingDigits(n int) int {// 贪心,利用字符数组s : strconv.Itoa(n)ss : []byte(s)leng : len(ss)if leng < 1 {return n}for i:leng-1; i>0; i-- …...
网络基础_1
目录 网络基础 协议 协议分层 OSI七层模型 网络传输的基本流程 数据包的封装和分用 IP地址和MAC地址 网络基础 网络就是不同的计算机之间可以进行通信,前面我们学了同一台计算机之间通信,其中有进程间通信,前面学过的有管道ÿ…...
机器学习:DBSCAN算法(效果比K-means好)
基本概念 核心对象:以点为圆心半径为r的圆,如果圈里面的样本点大于给定的阈值(minPts),那么这个点就叫做核心点 直接密度可达:点p在q为圆心的圆内 密度可达: p1与p2直接密度可达,p2与p3直接密度可达&…...
在Spring Boot中隔离@Async异步任务的线程池
在异步任务执行的时候,我们知道其背后都有一个线程池来执行任务,但是为了控制异步任务的并发不影响到应用的正常运作,我们需要对线程池做好相关的配置,以防资源过度使用。这个时候我们就考虑将线程池进行隔离了。 那么我们为啥要…...
FFmpeg架构全面分析
一、简介 它的官网为:https://ffmpeg.org/,由Fabrice Bellard(法国著名程序员Born in 1972)于2000年发起创建的开源项目。该人是个牛人,在很多领域都有很大的贡献。 FFmpeg是多媒体领域的万能工具。只要涉及音视频领…...
OAuth(开放授权)介绍
OAuth(开放授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另一服务提供商上的信息,而无需将用户名和密码直接暴露给第三方应用。这个过程提供了一种安全的授权方式,常用于允许用户让第三方应用访问例如邮箱…...
Online ddl和replace ddl
在这个之前我们先来了解两种文件类型 1. .ibd文件 表数据文件,存储了表的数据和索引信息,从Mysql8开始表定义信息,从.frm文件改为.dcl文件存储,而表数据和索引信息仍然储存在.ibd文件,.idb文件通常在书籍库目录下。 …...
WEB渗透—反序列化(九)
Web渗透—反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩哔_…...
蓝桥杯day02——第三大的数
题目 给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。 示例 1: 输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。 示例 2: 输入:[1, 2] 输出&…...
linux shell中set -e命令的作用
set -e 是一个在shell脚本中常用的命令,它的含义是在脚本执行过程中,如果出现任何一个命令的执行结果不是零(即命令执行失败),则立即退出整个脚本。 set -e 的用途是在脚本中进行错误处理和控制流程。通过设置set -e&…...
linux shell 字符替换命令
sed 文本 2.txt 内容如下: 1 2 3 4 511 121abcabcc1.替换文本指定字符或字符串,不更改原文件 将文本内容替换并输出,但不直接在原文档中修改: sed "s/旧字符串/新字符串/g" 文档 范例,将文本中的 1 替换为 b rootheihei:/# sed &…...
Vue3生命周期函数(简述题)
1.图示 2.说明 3.补充 1.在vue3组合式API中,我们需要将生命周期函数先导入,然后才能使用。 import {onMounted} from vue2.beforeCreate和created被setup()方法所代替...
11月29日,每日信息差//雷军个人向武汉大学捐赠13亿元现金//看电视默认设置新规一览:开机广告不超 5 秒、不设置一键付费
🎖 继长安汽车后,蔚来将与吉利控股达成换电业务合作 🎄 中国飞鹤入选工信部质量提升典型案例 🎆 雷军个人向武汉大学捐赠13亿元现金 🎇 奢侈品电商Farfetch或将私有化 🎁 亚马逊云科技宣布推出Amazon Q ✨ …...
融资经理简历模板
这份简历内容,以综合柜员招聘需求为背景,我们制作了1份全面、专业且具有参考价值的简历案例,大家可以灵活借鉴。 融资经理简历在线编辑下载:百度幻主简历 求职意向 求职类型:全职 意向岗位:融资经理 …...
iptables防火墙之SNAT与DNET
NAT 1.SNAT:让内网可以访问外网 2.DNAT:让外网可以访问到内网的机器 网关服务器,要开启路由功能 内核功能: sysctl -a 列出所有参数 内核参数,然后grep可以查看到默认的内核参数 内核参数配置文件 /etc/sysctl.…...
mysql使用--备份与恢复
1.mysqldump 1.1.使用mysqldump备份数据 1.1.1.备份指定数据库中的指定表 如:mysqldump [其他选项] 数据库名 [表1名 表2名 …] 如:mysqldump -uroot -hlocalhost -p1234 database1 student_score > student_score.sql 上述采用-u和-p完成用户登录&am…...
【vue实战项目】通用管理系统:信息列表,信息录入
本文为博主的vue实战小项目系列中的第六篇,很适合后端或者才入门的小伙伴看,一个前端项目从0到1的保姆级教学。前面的内容: 【vue实战项目】通用管理系统:登录页-CSDN博客 【vue实战项目】通用管理系统:封装token操作…...
【驱动】SPI驱动分析(六)-RK SPI驱动分析
前言 Linux的spi接口驱动实现目录在kernel\drivers\spi下。这个目录和一些层次比较明显的驱动目录布局不同,全放在这个文件夹下,因此还是只好通过看Kconfig 和 Makefile来找找思路 先看Makefile,里面关键几行: obj-$(CONFIG_SPI…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
