Java 确实是内存不高效的。同样的内存,fultter / dart 能够创建流畅的应用,而Java要么卡成ppt,要么疯狂吃内存。
测试一个虚拟机内存回收效率的方法:win下使用 procgov 假装本机只有 100 mb内存,再运行 gui 程序,测试卡不卡。
结果,javafx 卡成 ppt,flutter 写的桌面app却依然流畅,几乎没有卡顿!(例子:dart写的myune_music存在严重的内存泄漏,稍微切歌内存狂飙300mb+,然后限制100mb后仍然流畅,神奇吧!)
这说明 flutter / dart 的虚拟机比 java 更高级。人才不断涌入新的领域,Java8 已经成熟到可以封印起来装裱,成熟到可以使用一万年,新的改进似乎九牛一毛。
但当我从 64 位的java8切换到 32位的java8,内存需求立马减半 —— 即使限制 100mb 内存,也没有那么卡了。
这给我一点信心。我还是很喜欢 javafx。也曾升级到新的 open jdk,打包方式太复杂,反人类,而且几乎没有区别,尤其是浏览器内核,根本没人在开发新的jvm,都是语法糖而已。所以又回到 java8 并锁死。
那么,如何打包分享给其他用户呢?
搜遍全网,似乎没有好的方案?
- Launch4j : 提供把单个 jar 追加到预制的启动器后面的 blacksmith。
- jsmooth : 可以更方便地添加多个 jar 作为启动参数。
这些方案的本质是启动器。因为java程序的本质就是调用上位开发者提供的虚拟机.exe 运行编译后的字节码。
那我自己写个启动器好了!
先说我自己如何使用的:使用idea编译后,写个 bat 调用 java.exe 运行编译好的 class。
那么我的启动器就可以封装这条启动指令。并在没有jvm的时候,提供下载链接。
交给deepseek吧!
提示词:
ahk v1 写个 jar 启动器,蓝色背景。寻找符合条件的 java.exe (java 8),启动指令固定:java.exe -classpath "target\classes;libs/;MIJI/joni/" com.knziha.plod.plaindict.javafx.PlainDictionaryPcJFX
需要启动器GUI:一个输入框,可以填写 jre 路径或 java.exe 路径。旁边一个按钮可打开系统文件选择器。
下一行显示超链接 - 网盘下载 jre
下一行显示 - 调用浏览器网络搜素: jre-8u211-windows-i586.exe 镜像
上面三行用好看的组合框框起来。
底部左边一个优美的按钮“保存为快捷方式”,右边一个好看的启动按钮。
结果:
甚至还能有圆角版本的:
AHK 寻找 jvm 的代码十分简洁,涵盖注册表与环境变量:
FindJRE() {
; 从注册表查找 (补充)
RegRead, jrePath, HKLM, SOFTWARE\JavaSoft\Java Runtime Environment, CurrentVersion
if (jrePath != "") {
RegRead, jreHome, HKLM, SOFTWARE\JavaSoft\Java Runtime Environment\%jrePath%, JavaHome
if (jreHome != "") {
exePath := jreHome . "\bin\javaw.exe"
if (FileExist(exePath))
return exePath
}
}
; 从 JAVA_HOME 环境变量查找
EnvGet, javaHome, JAVA_HOME
if (javaHome != "") {
jrePath := javaHome . "\bin\javaw.exe"
if (FileExist(jrePath))
return jrePath
jrePath := javaHome . "\jre\bin\javaw.exe"
if (FileExist(jrePath))
return jrePath
}
; 从 C 盘安装目录查找
paths := ["C:\Program Files\Java\jre*\bin\javaw.exe", "C:\Program Files (x86)\Java\jre*\bin\javaw.exe"]
for _, path in paths {
Loop, %path%
{
if (FileExist(A_LoopFileFullPath))
return A_LoopFileFullPath
}
}
return ""
}成功启动后,可以点击“保存快捷方式”按钮,就能直接运行 javaw.exe,不再需要启动器,干掉中间层!
这一招帅不帅,别人还在研究怎么使用第三方预制的启动器.exe,我已经干掉启动器了,启动器就是个跳板,可以直接使用快捷方式.lnk的。