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…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
