Hacker News

Top stories

Live mirror
30 storiesupdated just nowView source snapshot
  1. Claude Code now reads AGENTS.md if there is no Claude.md(claude.com ↗)
    148comments
  2. Android 17 is the first since 3.x to add new APIs without releasing to the AOSP(grapheneos.social ↗)
    203comments
  3. How OpenAI Used Its Own LLMs to Design Its Jalapeño Chip(ieee.org ↗)
    11comments
  4. Saving another 100TB of RAM(cloudflare.com ↗)
    36comments
  5. Cloudflare Quick Tunnels(cloudflare.com ↗)
    236comments
  6. Xcode 27.1 Beta Release Notes(developer.apple.com ↗)
    63comments
  7. Photon-Emission-Guided Laser Fault Injection Enables RP2350 Secure Debug(ledger.com ↗)
    46comments
  8. Cache-to-Cache: Direct Semantic Communication Between LLMs (2025)(arxiv.org ↗)
    11comments
  9. How to Write with an LLM(sockpuppet.org ↗)
    254comments
  10. Show HN: Cactus Needle 3: 8-29MB automation models can match DeepSeek V4 Flash(cactuscompute.com ↗)
    72comments
  11. The first new cat species discovered in 100 years(nationalgeographic.com ↗)
    39comments
  12. OpenJev(openjev.com ↗)
    239comments
  13. A 1542 papal cipher cracked with simulated annealing(simonklee.dk ↗)
    discuss
  14. Cyclomatic Complexity in C#(ndepend.com ↗)
    12comments
  15. Two parallel neural ectoderm progenitors contribute to the developing brain(newscientist.com ↗)
    51comments
  16. The Implications of Linguistic Illegibility for LLM Security(arxiv.org ↗)
    17comments
  17. US troop deaths during Iran war exceed Pentagon count by at least four(reuters.com ↗)
    55comments
  18. C++26: Trivial infinite loops are no longer undefined behaviour(sandordargo.com ↗)
    169comments
  19. Size-Specialized Memory Allocation(go.dev ↗)
    3comments
  20. Warez: The Infrastructure and Aesthetics of Piracy (2021)(archive.org ↗)
    13comments
  21. Minimal Phone 2(minimalcompany.com ↗)
    158comments
  22. Inside ZCode: Silently uploading your Git history to the cloud(ferstar.org ↗)
    89comments
  23. How SpaceX streamlined the Raptor engine(construction-physics.com ↗)
    28comments
  24. A search-and-inference database from scratch in pure Zig(antfly.io ↗)
    16comments
  25. I vibed a proof of Conway's conjecture(overreacted.io ↗)
    179comments
  26. Korea raises data breach fines to 10% of revenue(koreajoongangdaily.com ↗)
    78comments
  27. North Korean nuclear test sets off years of earthquakes(science.org ↗)
    149comments
  28. From Geometry to Algebra and Back Again: 4000 Years of Papers (2023) [video](youtube.com ↗)
    discuss
  29. Mathematicians Build Long-Awaited Graph Sandwich(quantamagazine.org ↗)
    18comments
  30. Cekura (YC F24) Is Hiring(ycombinator.com ↗)
    discuss

Jemalloc 5.4.0

321 pointsby 19h agogithub.com
87 comments
17h agoHN ↗

Why is this on the HN front page? Is there something particularly noteworthy about this release?

17h agoHN ↗

They resumed development on jemalloc only recently, after years of no releases.

15h agoHN ↗

Development was never stopped for jemalloc. This is a common misconception. There just were not releases being tagged and packaged against the ongoing development.

17h agoHN ↗

I just checked whether it's the first release after Jason Evans stepped down as maintainer, but it isn't. That was the previous release, 5.3.1

16h agoHN ↗

jemalloc is something you should be aware of if you do software for a living

16h agoHN ↗

Why? Writing a memory allocator is quite simple, and I'd argue that _everyone_ should write one from scratch for any kind of high performance application. It's also trivial to outperform general purpose allocators that have to satisfy countless constraints. I've written numerous special purpose mallocs that are a) both provably (formally) safer than the standard armada and b) significantly faster (>10x throughput).

16h agoHN ↗

Your experience writing memory allocators is irrelevant. The point is that jemalloc is widely used and that’s why it makes sense to be aware of it.

16h agoHN ↗

I'd happily see performance, latency and stability of your allocators in massively multithreaded, long-living programs with workloads where hundreds or thousands of parallel threads continuously create and destroy short-lived small and medium objects.

Writing allocators for domain-specific access patterns is easy. Writing a general-purpose high performing, stable allocator with bounded P99 latency is hard.

Give your friend, Dunning–Kruger, some better pills to keep him from speaking through you.

16h agoHN ↗

You're correct, but his point is that you don't need to solve the generic problem. Solving the generic problem is very hard. Grug doesn't like solving hard problem. What does grug do? Solve five easy problems. Make an arena for the short-lived objects, reuse the objects, use generic multithreaded malloc for the rest. Grug happy.

15h agoHN ↗

Not everything needs to be general purpose. Allocation can be as easy as bumping a pointer, and it's hard to beat that.

13h agoHN ↗

where hundreds or thousands of parallel threads continuously create and destroy short-lived small and medium objects.

Should one even want a global, general purpose heap allocator for that? Seems like a crazy idea to even consider.

13h agoHN ↗

I guess the point was that before you consider using a different allocator you should rule out a custom one.

And that's rather hard, because a general purpose allocator makes all decisions based only on the requested size. This is a very simple interface and such a tool is worth having. But a custom allocator can both bake in a specific scenario and provide more nuanced interaction.

13h agoHN ↗

massively multithreaded, long-living programs with workloads where hundreds or thousands of parallel threads continuously create and destroy short-lived small and medium objects.

My first thought would be to use per thread pool allocators.

16h agoHN ↗

Writing an allocator is simple, you’re correct, but writing an allocator that doesn’t suck is not simple.

16h agoHN ↗

In the Before Times, the vast majority of software was written in garbage collected language where a working knowledge of the relative merits of C memory allocators is not useful or particularly relevant.

Why would the scads of people writing JavaScript, Java, python, go, rails, etc need to be aware of jemalloc?

15h agoHN ↗

TL;DR: Because the runtime of most GC:d languages uses malloc for its internal data structures.

I work for the runtime team of JPG @ Oracle. We use malloc in Hotspot, quite a lot actually! Providing your JVM with a good malloc can improve the performance of the runtime, both in terms of CPU and memory, by quite a bit.

I don't think you need the details, but it's good to be aware that some mallocs are better than others, and there are multiple of them. Being aware of jemalloc is a good way of being aware of the facts I just mentioned :-).

7h agoHN ↗

The vast majority of professional developers are not in a position where they can just swap out allocators willy-nilly. They take what they get, and write the code they're assigned to write on the platform the CTO or their product lead or whoever has decided upon.

7h agoHN ↗

Okay, well, I guess all I can say is that if you strive to be one of the developers who do get the chance to care about this stuff, then you should know this stuff :-).

15h agoHN ↗

...the vast majority of software was written in garbage collected language

and even then recently it costed (us) quite a few months to blame JVM and later the default glibc memory allocator for running out native (not java heap memory) - had to exclude all possible native libs (zlib, zstd via jna), direct buffers, sockets, thread stacks and so on. Changing the malloc to jemalloc solved the issue, even though initially it was done for its debugging capabilities.

It's just a great memory allocator.

14h agoHN ↗

I'm never sure if I should be upset or happy when I've been debugging a problem for long enough that I finally decide to switch something out in order to improve visibility and that immediately solves the problem for entirely unexpected reasons. Particularly all the times when I couldn't readily discern why.

3h agoHN ↗

We changed to jemalloc first on a jvm service which we could never get to run in its kube memory limit. with jemalloc its been dead stable for years, and we made it the default for all jvm services

15h agoHN ↗

Memory allocation behaviour has visible impact also for users of managed languages, and the behaviour of software for end users.

In our Python program, a bit of numpy processing of large pictures led to 100 GB not being returned to the OS by glibc's default allocator and the machine running out of memory shortly after. With jemalloc's reliable memory return settings, those problems disappear.

11h agoHN ↗

I'm in the same boat, I just switched to using it for Kavita, which only does some basic open Image -> Thumbnail to smaller size -> write to disk when importing new comics/books and on linux, memory could swell to 10GB and never get released. Switched to jemalloc and instantly memory stayed well below 1GB.

10h agoHN ↗

Generally yes, but the wording of "instantly" begs for the following pedantic remark:

This is controlled by jemalloc settings `dirty_decay_ms`, `muzzy_decay_ms`, and their interaction with `background_thread`.

`dirty_decay_ms` currently defaults to 10 seconds, so it's not that instant.

That is important e.g. for single-threaded programs that start other programs, such as my Python example: If it starts a subprocess before the 10 seconds elapse after `free()`, Python (and jemalloc) do not run, and get no chance to return memory to the OS.

In such cases, either enable `background_thread`, or set the `_decay_` values to `0` to ensure immediate return to the OS upon `free()`. (This costs some performance.)

See e.g. https://github.com/jemalloc/jemalloc/issues/2688

9h agoHN ↗

Okay but do you think the hordes of JavaScript developers at FANG can just change the browser’s allocator?

The number of programmers who are in positions to care about jemalloc vs other malloc is minuscule

12h agoHN ↗

Because unfortunately, the runtimes belonging to all or at least most of those languages perform a lot better with jemalloc than with the system default.

I wish that wasn't the case, but it is.

16h agoHN ↗

I upvoted it because I benefit from jemalloc in my stack (RoR) and I am tired of AI taking over HN front page. Let the hacker spirit be back!

15h agoHN ↗

Upvoted for the same reason. We would not be able to run our workloads without Jemalloc. Kudos to this awesome piece of software.

15h agoHN ↗

You are not alone - my first thought was 'oh, HN is trying to bring back the disappointed hackers'. All this AI hype over every little model update fart is so exhausting and boring …

15h agoHN ↗

because people like you are too busy whining about it to put up something more interesting

14h agoHN ↗

Why is this on the HN front page?

This question was not necessary. You know the answer, because people upvoted this.

13h agoHN ↗

I don’t want to dwell on drama, but it is perhaps worth mentioning that we reached a sad end for jemalloc in the hands of Facebook/Meta even though most of the people involved were acting in good faith.

Far from the only case. Trillion dollar companies having sudden interest in your open source project is not necessarily a long term benefit.

3h agoHN ↗

I thought it was developed internally there

3h agoHN ↗

but then we can't make it all about ripping on big companies

7h agoHN ↗

Post-ZIRP reality of corporate self-interest being re-established.

16h agoHN ↗

I always wondered, is it French? "Je m'alloc du memory"

15h agoHN ↗

Rather a tradition to call a malloc by the initials of the implementer: Jason Evans malloc (jemalloc), Poul-Henning Kamp malloc (phkmalloc), Doug Lea (dlmalloc).

P.S. I also wondered whether systemd had any cultural reference to Système D aka Système Débrouillard, but Pottering does not seem to engage in word play on other occasions, so probably not.

15h agoHN ↗

damn i always thought it was a french thing, this is blowing my mind

14h agoHN ↗

"Yes, it is written systemd, not system D or System D, or even SystemD. And it isn't system d either. Why? Because it's a system daemon, and under Unix/Linux those are in lower case, and get suffixed with a lower case d."

Source: https://brand.systemd.io/

3h agoHN ↗

I love how autocorrect thinks I mean to type systems, not systemd. I mean they are one key away on qwerty and systemd is definitely not a word.

10h agoHN ↗

you were right, check siblings of your comment.

13h agoHN ↗

It does

Systemd was launched in April 2010; it adopts various ideas from previous init systems and combines them with a uniform configuration and administration interface. Systemd operates as a background service (daemon) and controls important system configuration tasks including hardware initialisation and the starting of server processes. The developers thought that its name is suitably reminiscent of the French term "système D", an expression that relates to "thinking on your feet" and describes high-speed technical problem-solving abilities such as those displayed by TV action hero MacGyver.

https://web.archive.org/web/20121014173559/http://www.h-onli...

15h agoHN ↗

Thanks, now my brain will forever read it like that. I'm not even a little bit French.

14h agoHN ↗

Fun grammatical fact that I only learned after years of speaking French: when borrowing words from other languages, you usually (not always) take the gender of the equivalent word in French, so technically it would be “de la memory” :)

14h agoHN ↗

That's the rule the old geezers at the Academy insist on. But then you have idiotic situations where everyone is using "le" for e.g. the COVID virus, while Academicians cry about the D meaning "Disease", which is feminine, making it "la COVID" in their book. As for all languages, the most important rule is that usage prevails. And that's something we in France still have a hard time integrating into public discourse.

13h agoHN ↗

An interesting case is "WiFi", short for "wireless fidelity". "Fidélité sans fil" in French should be feminine, but every technical person says "le WiFi" (masculine) while many (most?) non-technical people intuitively say "la WiFi" (feminine).

13h agoHN ↗

If you keep your access point secure and in good working order, or if you can flash any firmware into OpenWRT... make sure to publicly credit your excellent "Wi-fu"

13h agoHN ↗

Better keep the wifi working, or your waifu could get angry.

6h agoHN ↗

WiFi is not an acronym for "wireless fidelity"; the developers likely just thought it sounded cool. The term is probably just a play on the words from the audio term "high fidelity". The phrase "Wireless Fidelity" is meaningless.

The more you know!

1h agoHN ↗

Wiki on wifi:

It is disputed whether the name Wi-Fi is short-form for 'Wireless Fidelity',[34] although the Wi-Fi Alliance did use the advertising slogan "The Standard for Wireless Fidelity" for a short time after the brand name was created,[31][35] referenced "the Wi-Fi (Wireless Fidelity) logo" in a white paper[33] and the Wi-Fi Alliance was also called the "Wireless Fidelity Alliance Inc." in some publications.[36] IEEE, a separate but related organization, has stated "WiFi is a short name for Wireless Fidelity" on their website.[37][38] The name Wi-Fi was partly chosen because it sounds similar to Hi-Fi, which consumers take to mean high fidelity or high quality. Interbrand hoped consumers would find the name catchy, and that they would assume this wireless protocol has high fidelity because of its name.[39]

So it’s not really safe to say it’s not meant to mean wireless fidelity, in fact it sounds pretty likely.

15h agoHN ↗

Ok. Why both the homepage and its Github repo doesn't make a single mention of Jason Evans? I know he stepped down but surely it is at least worst mentioning it?

Is Meta still using it and developing it? If not who are the driving force behind it now? I just checked there wasn't a release since 2022 and then we have this now. Something changed?

Just wish we have a little bit of context. But it is also great it is continue being maintained. It makes a huge difference for Ruby on Rails Apps.

15h agoHN ↗

Just wish we have a little bit of context

See the comment of vocx2tx

15h agoHN ↗

does anyone familiar with the art have thoughts on why only tcmalloc switched from thread caches to cpu caches? would it make linux behavior diverge too much from other platforms?

14h agoHN ↗

I think tcmalloc gains on thread churn and oversubscription by going the cpu-cache route on Linux. on other platforms, I am not so sure but that can be offset by say a treiber-stack like setup for cross-thread frees/teardowns. So lesser code for Linux for similar fastpath design I guess.

8h agoHN ↗

on other platforms, I am not so sure

tcmalloc only works on Linux.

14h agoHN ↗

(Not an expert but ...) unless you pin threads to cores, which is not the default and somewhat awkward in Linux for user applications, having a per-thread cache doesn't really make sense as your thread could be moved to another core and then your cache will no longer be local to the physical cache.

13h agoHN ↗

i think we agree that per cpu caching seems superior. i’m looking for the other side of this. most allocators seem to have stuck with per thread.

12h agoHN ↗

If you use a thread-local data structure, your allocator can pretend that it is running on a single-core, single-task system.

If you use a CPU-local data structure, you must handle the case where, mid-way through a call to your allocator, the CPU runs a second thread that makes another call to your allocator (and that, too, can get interrupted by another thread that allocates memory, etc.)

That makes thread-local easier to implement and likely faster (it doesn’t require any memory barriers in the fast path)

Also, good schedulers try to avoid moving threads between CPUs. The better they manage to do that, the lower the cost of having per thread data structures (there likely still is a price, as there most of the time are more threads than CPUs on a system)

11h agoHN ↗

Setting aside whether or not you can pull off a lock free approach here we can be certain of a couple things. There will be at least some overhead that must be paid somewhere even if that's on a separate management thread. And there will be a lot of additional complexity because that's just how concurrency always is.

Meanwhile the better the scheduler performs the more competitive the thread local approach becomes.

6h agoHN ↗

https://docs.kernel.org/userspace-api/rseq.html

cost for interruption in an rseq critical section is that the PC gets overwritten to the rseq abort entry point before the task is rescheduled. no management thread necessary.

should be fairly minimal cost, especially assuming interruptions in the critical section are rare.

1h agoHN ↗

That's certainly interesting but I don't see how it would change my answer to you. Your question was why projects don't switch. My answer was because doing so seems likely to be a wash at absolute best.

Giving it some more thought, I expect caches will typically be wiped out by a context switch. So the only place rseq is likely to benefit an allocator is on systems with multiple NUMA nodes where you'd like to make sure any management code isn't paying a penalty by hitting the wrong address range.

IIUC rseq (ie CPU local data) is primarily good for two things. The first being obviating the need for atomics (specifically the resultant cache line ping-pong) but thread local data already accomplishes that. The second being massive oversubscription of physical CPU cores (ie tens of thousands of threads) where TLS becomes utterly wasteful while also thrashing the cache.

9h agoHN ↗

https://lwn.net/Articles/1033957/:

  rseq_cs

   The rseq_cs field is a pointer to a struct rseq_cs. Is is NULL when no
   rseq assembly block critical section is active for the registered
   thread. Setting it to point to a critical section descriptor (struct
   rseq_cs) marks the beginning of the critical section.

I’m not sure I fully understand that man page (it never seems to say callers have to clear that field at the end of a critical section, for example), but doesn’t that mean the caller has to guarantee setting rseq_cs happens_before any code in the critical section? That’s a memory barrier.

7h agoHN ↗

That is because you do not need to clear the field at the end of a critical section. It contains the contiguous instruction range where it fires so there is no problem with leaving it active forever unless you have another critical section where you want to use it.

No explicit memory barrier is required anywhere as the value is only read in supervisor mode and a privilege switch implicitly issues a LS-LS barrier on all major architectures. Even if you did not want to rely on that, you would only need a single S-LS barrier when you store the control structure the very first time.

3h agoHN ↗

That is because you do not need to clear the field at the end of a critical section. It contains the contiguous instruction range where it fires so there is no problem with leaving it active forever unless you have another critical section where you want to use it.

Aha! So, to take advantage of that, a memory allocator uses the same abort handler for all operations?

6h agoHN ↗

It's just a compiler barrier (signal fence), not a memory barrier that concerns the CPU. The CPU is free to reorder loads and stores.

8h agoHN ↗

Exactly. You want memory arenas that are hot in this CPU's caches. If your thread moves, its per-thread caches are now elsewhere. Original TCMalloc was developed in the days of 2-4 core servers. Current TCMalloc was an evolution in the context of 32+ core servers.

6h agoHN ↗

my feeling is that the space efficiency gains are probably more significant than the reduction in core migration costs. many applications have far more threads than the system has cores.

6h agoHN ↗

Sure, also true that the per-CPU scheme co-evolved with the proliferation of services with thread-per-request architectures having way more TIDs than cores.

4h agoHN ↗

Don't you just take the current cpuid when you go to access the cache again? Then you mutex and access the per-cpu state. There is a tiny race window but 99.99% of the time you will be hitting the same cpu's cache as you just identified, and there will be ~zero contention.

The main issue is thread preemption while you're holding a per-core cache mutex. Some other thread can't do meaningful work using the cache while the holder is sleeping.

14h agoHN ↗

I switched to jemalloc on a sidekiq queue and memory dropped from 8gib to under 1gib

There’s a slow memory leak somewhere in my code but with jemalloc it no longer actually matters.

Thanks to jemalloc team for this!

8h agoHN ↗

This is the most funny thing I read today!

3h agoHN ↗

Ha, it’s like that for us except we deploy an update at least every few months, which obliterates our machine and restarts then launch sequence

8h agoHN ↗

I use Jemalloc on a project because it has per-thread allocation counters. This lets me not only track what each thread is using, but also restrict workloads by enforcing a memory budget. Since my application is almost completely CPU-bound, I allocate one thread per core and then have some smart scheduling to route requests to the threads. I looked at tcmalloc and mimalloc, and neither had this feature at the time, nor did they seem to have any similar feature that could let me have per-thread heaps, which surprised me.

7h agoHN ↗

Nice to see jemalloc active again. The long-term health of the upstream project is probably just as important as the allocator improvements themselves.