分类 jvm 中的文章

GraalVM与Native Image详解:原理、Spring Boot样例与编译/运行镜像选型

前言

Java 应用启动慢、吃内存、还要预热,放在 Serverless 和弹性伸缩的场景里很难受。GraalVM 的 Native Image 用 AOT 编译解决了这个问题:毫秒启动、内存省一半、连 JVM 都不要了。代价是反射要登记、构建要等几分钟、生态要适配。这篇把原理讲清、把 Spring Boot 3 的样例跑通,重点记录一下我在容器化时踩坑最多的部分:编译镜像和运行镜像怎么选。

……

阅读全文

OpenJDK厂商选型:从Oracle JDK到BellSoft Liberica,那些容易被忽略的差异点

前言

JDK 8 时代「装个 JDK」没得选,Oracle JDK 一把梭。2019 年 Oracle 改了授权之后,生产环境陆续迁到 OpenJDK 系的发行版上。但「都是 OpenJDK」不等于完全一样,加密策略、字体这些细节差异,我是迁完之后在生产上才碰到的,记录下。

1、Oracle JDK 和 OpenJDK 什么关系

  • 2006 到 2019:Sun/Oracle 开源了 OpenJDK,但 Oracle JDK(商业授权)和它并存,细节上有一些差距
  • 2019 年 1 月:Oracle 宣布 JDK 8u211 之后以及 JDK 11 起商用要收费,这是大家迁 OpenJDK 的分水岭
  • 现在:Oracle JDK 17+ 又恢复免费(NFTC 协议),但条款写明下个 LTS 发布后旧 LTS 可能转回收费,企业不太敢把命脉押在这种条款上

代码层面 Oracle JDK 和 OpenJDK 已经高度同源,差异不到 1%。选型的差异主要在:谁构建、谁维护、免费支持多久。

……

阅读全文

JDK 8到21迁移指南:参数变化、GC演进与虚拟线程实战

前言

手上一批老服务还跑在 JDK 8 上,Oracle 的免费更新早就停了,趁着最近有空把几个服务迁到 21 试了试,过程不算复杂,但坑主要在两个地方:老参数会直接启动失败,还有依赖库的字节码兼容。把迁移过程和注意事项记录下,方便后来者。

站内 tomcat-jvm 那篇有 JDK21 的参数对照,oom 那篇有 OOM 新旧形态对照,这篇侧重怎么迁。

……

阅读全文

jvm的大dump文件分析

前言

参考dump文件的大小,如果超过6G、8G 一般我们本地电脑无法打开,可以找大容量的linux服务器,配置对应启动的jvm 内存后可以参考下面的步骤

1、下载linux版本的mat

1
wget http://eclipse.stu.edu.tw/mat/1.9.0/rcp/MemoryAnalyzer-1.9.0.20190605-linux.gtk.x86_64.zip

2、解压zip包

unzip MemoryAnalyzer-1.9.0.20190605-linux.gtk.x86_64.zip

3、修改linux mat的堆内存大小(看自己下载的堆的大小,默认mat的堆支持1g)

1
vi MemoryAnalyzer.ini
1
2
3
4
5
6
-startup
plugins/org.eclipse.equinox.launcher_1.5.0.v20180512-1130.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.700.v20180518-1200
-vmargs
-Xmx10240m

4、执行分析脚本

1
./ParseHeapDump.sh [hprof文件] org.eclipse.mat.api:suspects org.eclipse.mat.api:overview org.eclipse.mat.api:top_components

可能因为 jdk 版本不一致导致启动失败,可以调整 jdk 为1.8.*

1
2
3
export JAVA_HOME=/opt/soft/jdk/jdk1.8.0_66/
export PATH=$JAVA_HOME/bin:$PATH
"$(dirname -- "$0")"/MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@"

5、等待分析结果

……

阅读全文

最近文章

分类

标签

其它