> For the complete documentation index, see [llms.txt](https://freebsd-journal-cn.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://freebsd-journal-cn.bsdcn.org/2026040506-gai-jin-ruan-jian-zhi-liang/modern-java-on-freebsd.md).

# FreeBSD 上的现代 Java

## 专访 Harald Eilertsen

### Tom Jones

2025 年 9 月，Harald Eilertsen 在 EuroBSDcon 上发表了题为 “[改进 FreeBSD 上的 OpenJDK——我们的进展与我所学到的](https://events.eurobsdcon.org/2025/speaker/LPKAQ9/)” 的演讲。Harald 一直与上游 OpenJDK 项目合作，改进对 FreeBSD 的支持。与 Harald 对谈的是 Tom Jones。Tom 是一名提交者，《FreeBSD 期刊》编辑委员会成员，也是期刊的定期撰稿人。

**Tom:**

你是怎么开始用 FreeBSD 的？

**Harald:**

我或多或少用 FreeBSD 很久了。我最早是在 2000 年代初尝试在桌面系统上用它。具体记不清了，但至少对我来说效果不太理想。当时在桌面上运行它有不少问题。

我在服务器上用它很久了。基本上我在朋友的服务器上有一个 Jail，算是有了自己的虚拟小空间，里面托管了各种 web 服务和我自己的社交网络、我自己的 fediverse 实例，还有……对，很多不同的博客、我的乐队、我的各种东西，有时也帮别人托管。

**Tom:**

你从 FreeBSD 用户转向开发的过程是怎样的？

**Harald:**

我一辈子基本上都在做开发，但之所以开始做 FreeBSD 上的 OpenJDK 这个项目，主要是因为 FreeBSD 基金会在找人来做这件事。

**Tom:**

你之前做过 Java 开发吗？

**Harald:**

我做过一些 Java 开发，但那是几十年前的事了。对我来说，JVM 比 Java 语言本身更有意思。

它更多是 C++ 加一点汇编，而不是 Java 本身。它是驱动 Java 运行的系统。我看到 Java 语言本身也有不少进展。所以过去十年里，它变得比最初现代多了。

**Tom:**

嗯，我很久没碰 Java 了，对此我很高兴。

**Harald:**

大多数人都这样。

**Tom:**

通过这项工作，你了解到人们想在 FreeBSD 上的 OpenJDK 里运行哪些东西吗？

**Harald:**

嗯，了解一些，部分是因为我认识一些在生产环境里用 FreeBSD 跑 Java 的人。

也因为从 bug 报告和其他渠道看到的情况来看，它似乎主要跟那些大型关键系统有关。

比如 Elasticsearch，比如 Tomcat，至少目前我的印象是大多是服务端的东西。

我以前工作过的一家公司用 Java 做 “卡不在场” 支付认证。认证的是卡片，不是支付。那套系统跑在 Java 上。所以看起来 Java 仍用于很多关键系统和重要系统，而这些系统在某种程度上对普通人是隐藏的。

**Tom:**

你刚开始做的时候，情况如何？

**Harald:**

当时有个 JDK 23 的 Port。那是在上游即将发布 JDK 24 之前。

我花了一些时间熟悉代码，熟悉它怎么运作，熟悉怎么跑单元测试之类的。我遇到的问题之一是很多单元测试……不是很多，但有几个相当关键的单元测试跑不过。

原因很多。所以我到目前为止做的工作，一方面是修复单元测试或测试框架，让它们在 FreeBSD 上能跑，另一方面是修复单元测试或测试标记为不工作的代码。

我觉得现在的状况是，JDK 24，还有我弄好之后即将推出的 25，是一个比以往版本更扎实的 Java 或 JDK 实现，在 FreeBSD 上跑得更好，性能也更好。

**Tom:**

你对性能提升的幅度和体现在哪些地方有概念吗？

**Harald:**

一部分是因为有用户告诉我，哦，我们在某处有性能问题。

有个相当大的 Elasticsearch 安装在内存超过 128 GB 的系统上有性能问题。看代码，那部分是 Elasticsearch 想知道已提交内存的量以及我们怎么核算它，而我们之前的做法不太理想。

一旦找到问题所在，改动相当简单。

FreeBSD 基本上有个 API 能直接给你这个数值，我们不必费劲遍历文件、做一堆计算。所以一旦改好，用户确认了，对，这能用。就是这类问题。

**Tom:**

有没有随手就能说出的百分比提升？

**Harald:**

没有，而且我觉得这也很大程度上取决于你的工作负载。我正在做的一件事，也是 [bapt@](https://reviews.freebsd.org/p/bapt/) 一直在帮忙的，就是减少对 `procfs` 文件系统的依赖。

代码从 Linux 那边来，严重依赖 `procfs` 系统，而这在 Linux 上似乎比在 FreeBSD 上快得多。

在 FreeBSD 上，我们通常有更好、更简单的方式获取这些信息。所以完全去掉它会是一种改进。

我没做过严格的性能测试，尤其是我说的这个问题，我没有那样的机器来测。我没有那种内存的机器。而且我猜，搭建一个高负载的 Elasticsearch 集群或安装要花些力气，也要花些时间去测量。

**Tom:**

我的经验确实是这样：一部分问题是大型机器不好弄。要是能联系到社区里更多的人，能说 “我把机器跑在我们的测试负载上，这是怎么做的”，那就太好了。

**Harald:**

这个 Elasticsearch 的事也是一样。我和报告问题的人联系得不错，他们非常乐意帮忙，这种情况下我基本上就说 “这看起来不太理想，试试别的办法。” 然后我把补丁发给他们，他们基本就确认了，对，这解决了问题，所以只能这样测。这种情况下是他们做的测试。我则想办法弄清该改代码里的哪里。

**Tom:**

对我来说，当我把 VPP 移植到 FreeBSD 时，`procfs` 里有很多东西只是从文件读字符串来做配置，相关的改动大多数时候都很直接，要么用 `sysctl` 接口，要么我们有原生接口。

**Tom:**

感觉我们应该有一份移植软件的指南，比如，`grep` 这个模式，然后替换掉。

**Harald:**

我想，对，这基本就是我选的方案。要么用 `sysctl`，要么有东西直接给我结果，所以快得多。我觉得 OpenJDK 至少有个问题，就是传统上，尤其是 OpenJDK 的 hotspot 代码里，源码树的 BSD 部分包含了 Mac OS，因为他们传统上把 Mac OS 看作 BSD。

虽然我们需要的代码通常更接近 Linux 代码（但不一定完全相同），而 Linux 代码在源码树的另一个子目录里，所以有时会有点混乱，因为有时你有这种 BSD 专用代码，基本分成一份、两份，有时更多，因为不同的 BSD 做事方式也不同，但 Mac OS 部分通常和这些都完全不同。

**Tom:**

上游接受补丁的情况怎么样？

**Harald:**

他们很友善，也很严格。所以把补丁推到上游有一套定义得很清楚的工作流和流程。他们不希望看到的情况之一是，一个几乎被支持的平台有一套不完整的补丁集。

他们非常支持把 BSD 纳入上游，但有一个明确的流程要做。

你得按他们的流程来，所以我们现在做的是在 github 上的 OpenJDK 组织下有了自己的仓库，我们会在里面创建一些分支来开发，并与上游保持同步。一旦到了这能工作、测试通过、一切就绪的时候，我们还需要写一份 Java Enhancement Proposal，声明我们想把 FreeBSD 或整个 BSD 或不管我们怎么做，变成上游支持的平台。

这需要获得通过，一旦我们到了那一步，基本上所有东西会一次性合并。但我已经有一些补丁，不是严格和 BSD 相关，但在过程中有助于被上游接受，他们的反应就是 “好”。他们对此一直很友善，也很支持。

这就是 Java 那句老口号：“一次编写，到处运行。” 看来他们真把它当回事。

**Tom:**

你看到尽头了吗？我们离做那次大合并、加入 FreeBSD 支持还有多近？

**Harald:**

我想我们现在正在开始做这件事。我不知道要多久，但我觉得大概六个月到一年之间能成。也许会更快，因为 Port 能用，我们基本上有了所有改动。

还有几个测试我暂时还跑不过，但我觉得一旦搞定，再加上有能在他们系统里跑的 FreeBSD CI，就行了。这是最近一直在做的，看起来有进展，所以我也说不好。

我是个程序员，我不会规划时间。

**Tom:**

一旦我们成为支持平台，是不是意味着不破坏支持的责任就落到别人头上了？

**Harald:**

对，因为那时我们就是 CI 流程的一部分，如果某个补丁导致 CI 失败，它就不会被合并。这不意味着他们非得自己修。可能是，对，他们联系我或 BSD 移植组的其他人就行。

**Tom:**

非常感谢你今天抽时间，在我们结束之前还有什么想聊的吗？

**Harald:**

我刚旅行回来，去了 EuroBSDcon，到处见了很多人，所以脑子有点空白。今年是我第一次参加 EuroBSDcon，我觉得体验不错。能见到真人很好，还有很多有趣的演讲。

我觉得，至少对我来说，作为某种程度上从外部来的人，我不算 BSD 社区的一员。能看到所有正在发生的事、人们在做什么，还有，怎么说呢，所有投入到构建系统里的手艺，对我来说很好。

**Tom:**

人们知道你做 OpenJDK 的工作后，向你提了很多功能请求吗？

**Harald:**

倒没有，看起来更多的是我得到了很多支持，比如：

“有人在做这个真好，我们在努力让 OpenJDK 变得更好、跑得更好，这真好。”

我觉得这是件好事，当然，把它推到上游让它被支持也是。

我觉得那才是更重要的部分。至少从人们的反应来看是这样。

**Tom:**

你有没有告诉人们去感谢 FreeBSD 基金会？

**Harald:**

嗯，我确实说了。这也正是关键。就像：“你为什么做这个工作？”

就是，“对，我是拿钱做的。”

但这也是我觉得有意思的项目，也觉得有挑战性。我做软件开发做了很久，在各种领域，不同系统，快 30 年了。我有很多经验。

既能引起兴趣、又大致符合我对自由软件和开源信仰的工作，并不那么容易遇到。所以能把这两者结合起来，得到一份有挑战性、我觉得——不是人人都能做的工作。

而且，工作机会其实很多。至少看可用的活儿的话，很多是 web 开发、JavaScript，还有随便什么最新框架。而我对那些没兴趣。

**Tom:**

很多——感觉像是为变而变。搞点新的、刺激的。

**Harald:**

所以这就是我的感受。

这份活儿让我能用上一些知识，也挑战我。我有很多东西要学，关于 FreeBSD，关于 OpenJDK，还有一切怎么运作。我注意到这两边都有非常博学的人。我能向他们学习。

这——我觉得很有价值。

***

**Harald Eilertsen** 是一名软件开发者和信息安全从业者。他从 1980 年代初开始编程，曾在 Tandberg、Cisco、Modirum 和 Automattic 等公司工作。目前他自雇，作为独立顾问工作。

**Tom Jones** 是一名 FreeBSD 提交者，致力于让网络栈保持快速。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://freebsd-journal-cn.bsdcn.org/2026040506-gai-jin-ruan-jian-zhi-liang/modern-java-on-freebsd.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
