News for hackers. Stuff that matters.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by sillysaurusx on Saturday April 23, 2022 @11:21PM (#31141038)
Ehh. Who cares, though? And I mean that in the least dismissive way.

Why do you care? Sell me on it. GCs have gotten to the point where the slowdown is almost the butt of jokes. LuaJIT proves that it can get damn close to C speeds.

What you’ve said sounds like a whole lot of complexity for … what?

Give me the automatic threading speed improvements with no extra programmer effort and I’ll change my stance 270 degrees.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by iscoelho on Saturday April 23, 2022 @11:40PM (#31141108)
1. LuaJIT can be faster than C due to optimizations regarding function calls.

2. GC is LuaJIT's greatest weakness [1] (It is very slow) - Most high performance projects disable it and only use C FFI allocations.

[1] http://wiki.luajit.org/New-Garbage-Collector

LuaJIT 3.0 (which will have the new garbage collector) also has no ETA and is not in development.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by verdagon on Saturday April 23, 2022 @11:40PM (#31141109)
A valid question, happy to enlighten!

To get the automatic threading speed improvements, a (region-aware) language might add a `parallel` keyword in front of loops, to temporarily freeze pre-existing memory, thus completely eliminating the overhead to access it. Vale is building this for its generational references [0] model but I hope that more RC-based languages attempt something like it. Can't get much easier than that ;)

Lobster's algorithm doesn't actually incur any additional complexity. It's completely automatic.

Perceus and HVM require immutability, which does require programmer effort, I admit. Pure functional programming just isn't as convenient as imperative programming for most. However, languages are learning to blend mutable and immutable styles, such as Pony [1], Vale [2], and Cone [3]. When a language allows you to create an object imperatively and then freeze it, it's wonderfully easy.

I think the next decade in languages will be about this exact topic: making it easy to have fast and safe code. I think RC will soon bring some very compelling factors to that equation.

[0] https://verdagon.dev/blog/seamless-fearless-structured-concu...

[1] https://tutorial.ponylang.io/reference-capabilities/referenc...

[2] https://vale.dev/guide/structs#mutability

[3] https://cone.jondgoodwin.com/coneref/refperm.html

Re:Chris Lattner on garbage collection vs. Automatic Referen... by MaxBarraclough on Sunday April 24, 2022 @05:57AM (#31142611)
I think the real point of their question was along the lines of GC works great and these days it's pretty fast, why research cleverer reference-counting?

Will these developments lead to appreciable performance improvements for 'typical' non-embedded, non-real-time programs?

Re:Chris Lattner on garbage collection vs. Automatic Referen... by Someone on Sunday April 24, 2022 @09:45AM (#31143935)
I think the consensus is that GC works great _if_ you throw enough memory at it (about three times what you really need)

On mobile, the problem with that isn’t as much that memory costs money, but that it costs Joules. Peak power usage of RAM may not be large compared to that of your screen, CPU, GPU, GPS, etc. but AFAIK, with current tech, memory keeps eating energy even if your device is sleeping.

Being able to run with less memory, I think, is why iPhones can do with relatively small batteries and yet have decent stand by times.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by astrange on Sunday April 24, 2022 @07:12AM (#31142961)
The fastest system currently out there is iOS, which (as this article says) doesn't use GC and does use clever reference counting, so yes?

Note, most people here arguing that GC is actually always faster are forgetting that reading memory itself has a cost, especially in systems with swap or other reasons it might have a /really/ large cost.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by kaba0 on Monday April 25, 2022 @09:28AM (#31154303)
You shouldn’t attribute the difference to the GC algorithm used when there are generations between ios’s CPUs and android’s.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by astrange on Monday April 25, 2022 @07:29PM (#31162199)
If you won't believe me, you could believe Chris in the article.

> Chris Lattner: Here’s the way I look at it, and as you said, the ship has somewhat sailed: I am totally convinced that ARC is the right way to go upfront.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by nu11ptr on Saturday April 23, 2022 @11:24PM (#31141051)
For me the biggest benefit is deterministic destruction, specifically for the non-memory resources it is holding (files, locks, etc.) the same as if it was stack allocated. It is very freeing knowing that is just being taken care of. No 'defer', 'with' or other special handling needed.

But possibly the bigger benefit: no heap allocation for many objects at all. If you can prove single ownership, you can stack allocate it (or "inline it" if in a struct/object).

Re:Chris Lattner on garbage collection vs. Automatic Referen... by shakna on Saturday April 23, 2022 @11:31PM (#31141074)
> No 'defer', 'with' or other special handling needed.

Just as an aside - in Python, it surprised me that 'with' is _not_ a destructor. The object created will remain in-scope after the 'with' body, but the '__exit__' method will be called. Which for the canonical example of file-handling, only really closes the file.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by jnwatson on Sunday April 24, 2022 @12:35AM (#31141330)
The done vs destroyed dichotomy is a cross-cutting concern for programs that need explicit control over resource lifetimes.

RAII is actually an antipattern in Python if you actually care about resources being released.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by shakna on Sunday April 24, 2022 @01:12AM (#31141456)
The surprise is less about resource usage and more about the scope lifetime. 'with' introduces a new binding that outlives its body. It looks, at first glance, to be a temporary variable. But it isn't.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by chombier on Sunday April 24, 2022 @04:05AM (#31142130)
I always wondered why does this variable leak outside the `with` scope, because this is really the one place where it should not.

IIRC python3 fixed scope leaks in list comprehensions, does anyone know why they didn't fix this one as well? Or does it have actual uses in practice?

Re:Chris Lattner on garbage collection vs. Automatic Referen... by shakna on Sunday April 24, 2022 @05:15AM (#31142411)
I don't know the _motivation_ for why it leaks, but it leaks because the method calls of a context manager are __enter__ and __exit__, but not __del__. [0]

The motivation is especially opaque, because though CPython does run __exit__ immediately, it isn't guaranteed to do so by the standard. So __exit__ will happen at some point, like __del__ with the GC, but it won't actually call __del__, which makes GC'ing the value more complicated as __del__ can't safely run until __exit__ does.

I _think_ the motivation is something to do with __exit__ being allowed to throw an exception that can be caught, whereas __del__ isn't allowed to do that, but I don't find it that convincing. And I've never seen an example where the introduced variable is ever referenced afterwards in Python's documentation (including in the PEP itself).

[0] https://peps.python.org/pep-0343/

Re:Chris Lattner on garbage collection vs. Automatic Referen... by chombier on Sunday April 24, 2022 @07:16AM (#31142977)
Thinking about it, my guess is that properly scoping the variable does not really prevent the user from leaking the value anyway:

    with context() as foo: 
        leak = foo
This is unlike list comprehensions, where it is syntactically impossible to bind the comprehension variable to a new name accessible outside the comprehension.

So maybe the reason is that it is not really worth the trouble.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by ptx on Sunday April 24, 2022 @11:22AM (#31144883)
Everything is always* scoped to the entire function in Python. Perhaps that's not always ideal, but at least the rule is simple.

* Well, not variables in generator expressions. There might be a few other exceptions.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by pphysch on Sunday April 24, 2022 @01:33AM (#31141536)
Consider the common pattern:

    with open(path) as file:
        result = func(file.read())

    another_func(result)
If `with` used a separate scope then it would be a lot less ergonomic. How might we bring data outside that scope and be confident that `with` isn't forcibly cleaning things up? Would be a lot more verbose.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by shakna on Sunday April 24, 2022 @01:49AM (#31141593)
I think you've missed what I've meant by a new binding. That the body executes is entirely intuitive.

However:

    with open(path) as file:
        ...

    if file.mode == 'r':
        print("Huh? file is still a thing?")
Re:Chris Lattner on garbage collection vs. Automatic Referen... by xscott on Sunday April 24, 2022 @04:07AM (#31142135)
Python doesn't have block scope, but most people don't seem to notice:

    def foo():
        if False:
             x = 123
        print("x is visible out here:", x)
That will generate an error because `x` is "referenced before assignment", but the variable exists for the entire function. This can bite you in subtle ways:

    x = "is global out here"
    def foo():
         print("all good:", x)

    def bar():
         print("not good:", x)
         if False:
              x = "now x is local, even before this declaration"
Re:Chris Lattner on garbage collection vs. Automatic Referen... by oaiey on Sunday April 24, 2022 @01:35AM (#31141541)
I would argue that resources need always explicit handling, no matter whether you do reference counting or GC. So if I do a one-liner to dispose an object or call delete on an object is the same beauty. Wait till the variable is out of scope together with many more or hit the GC cleanup is just not the right way to clean up externally resources in a proper way.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by SemanticStrengh on Saturday April 23, 2022 @11:37PM (#31141102)
What does it bring vs Java autocloseable?
Re:Chris Lattner on garbage collection vs. Automatic Referen... by nu11ptr on Saturday April 23, 2022 @11:41PM (#31141112)
Java's "try with resources" is effectively the same as Go's 'defer' and Python's 'with', so the advantage is that you can't forget to do it. No matter what you do, when the object goes out of scope, the resource will be closed.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by pjmlp on Sunday April 24, 2022 @04:30AM (#31142228)
If you actually use static analysis, you can't forget it in Java either.

And it isn't as if using languages without static analysis is still considered a best practice in the 21st century.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by tialaramex on Sunday April 24, 2022 @07:00AM (#31142890)
> And it isn't as if using languages without static analysis is still considered a best practice in the 21st century.

So in summary, "Please just do better". Not helpful as a video game meme, and really no better for programming.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by pjmlp on Sunday April 24, 2022 @07:45AM (#31143133)
I guess that is why no one bothers with clippy then, it is superfluous.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by tialaramex on Sunday April 24, 2022 @08:26AM (#31143372)
Everywhere that a clippy lint is there to catch bugs, I wish it wasn't a clippy lint because it won't always get run and those bugs will get missed.

An example of a clippy lint that I like in clippy:

If you try to transmute() &[u8] into a &str clippy will point out that you should probably from_utf8_unchecked() -- this lint results in code that does the same thing but is clearer for maintainers about what we intended. If our reaction to the lint is "But it isn't UTF-8" then we just got an important red flag, but that's not why the lint is there.

On the other hand, clippy lints for truncating casts and I want those gone from the language so the warnings ought to at least live in the compiler not clippy. I would like to see a future Edition outlaw these casts entirely so that you need to write a truncating cast explicitly if that's what you needed.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by throwaway2037 on Sunday April 24, 2022 @11:03AM (#31144688)
Is Java escape analysis done at compile time or run time? I don't know.

FYI: As I understand, escape analysis is frequently used to either (a) avoid allocating on the heap, or (b) auto-magically free-ing a malloc'd object from a tight scope.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by pjmlp on Sunday April 24, 2022 @12:42PM (#31145729)
First of all it depends on the implementation, the language specification doesn't state how it works.

https://en.m.wikipedia.org/wiki/List_of_Java_virtual_machine...

As it stands is mostly done at runtime and only for a).

Otherwise you are better with try-resources, and for something like malloced memory there are off-GC heap APIs.

Also Valhalla will eventually land, although it is getting long by now.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by vips7L on Sunday April 24, 2022 @06:42PM (#31148964)
Personally I wish they would move some escape analysis to compile time just to help with memory consumption. I’m assuming it would require byte code changes though.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by SemanticStrengh on Wednesday April 27, 2022 @01:43AM (#31176731)
Kotlin doesn't allow mistakes https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/use.h... For structured concurrency too.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by xxs on Sunday April 24, 2022 @02:11AM (#31141683)
>the non-memory resources it is holding (files, locks, etc.)

Locks are entirely a memory construct. You can trivially write one, e.g. Java locks are written entirely in java. The files descriptors (incl. socket) - they should not be relied to be GC'd by default, they do require their own lifecycle. For instance: c# Disposable/ java's try with resource.

>no heap allocation for many objects at all.

This has been already the case for many a year - reference escape analysis, ref. escape elission, trace compilation.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by tialaramex on Sunday April 24, 2022 @07:15AM (#31142971)
Locks are, in fact, one of many resources your operating system can give you.

Historically, in concurrent software your only option was to either use these OS allocated locks or build a spin lock from atomic operations (and thus burn CPU every time you're waiting for a lock). The OS allocated locks, such as from sem_open() or create_sem() must later be properly released or you're leaking a finite OS resource that will only be reclaimed on process exit or in some cases only at reboot.

Today your operating system probably offers a lightweight "futex" style locking primitive, in which so long as it's not locked no OS resources are reserved it's just memory. But, you're not guaranteed that all your locks are these lightweight structures and even if you were you need to clean up properly because when they are locked the OS is using resources so you need to unlock properly or you'll blow up.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by xxs on Sunday April 24, 2022 @09:04AM (#31143565)
The only part needed to build a lock is to be able to 'sleep' the current thread and the latter to be able to be awaken, plus compare-and-swap or load linked/store conditional. There is nothing really special about the locks as long as the current thread can be made dormant. Technically a single OS lock (e.g. a futex), associated with the current thread would suffice to implement as many locks as one desires. The lock would be released when the thread dies in the clean up code.

The locks that result in thread awaiting are still in-memory, of course. They are just OS provided primitives. Yet again, a well behaved/designed lock should be non-contested for the most calls (easily 99.9%+). In that case there is no mode-switch to get to the kernel. A contested lock that goes to the kernel is a context switch.

In the end there is no need to do anything special about locks as they can implemented in the user-space unlike the file descriptors.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by tialaramex on Sunday April 24, 2022 @04:41PM (#31148120)
> In the end there is no need to do anything special about locks as they can implemented in the user-space unlike the file descriptors.

If you get semaphores from create_sem() you will need to give them back, you can't just say "This shouldn't be an OS resource" and throw it away, exactly like a file descriptor it's your responsibility to dispose of it properly.

Speaking of which, depending on the OS, your file descriptors might also just be implemented in user space. They're just integers, it's no big deal, of course you must still properly open() and close() files, the fact it's "implemented in user space" does not magically mean it isn't your problem to clean up properly.

Likewise, if you opened a sqlite database, you must close it properly, you can't just say "Eh, it's only userspace, it will be fine" and throw away the memory without closing properly.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by xxs on Sunday April 24, 2022 @05:19PM (#31148441)
>If you get semaphores from create_sem() you will need to give them back...

I don't quite get the continued argument - the created locks in the user space have 'zero' extra dependency on the kernel. In a GC setup they would be an object no different than a mere string (likely less memory as well). They can be GC'd at any time as long as there are no references to them.

If you wish to see an example: java.util.concurrent package. ReentrantLock[0] is a classic lock, and there is even a Semaphore in the same package (technically not in the very same). Originated in 2004 with JMM and the availability of CAS. You can create as many as you choose - no kernel mode switch would occur.

For the record I do no object that proper resource managed is needed - incl. sqldatabase close. The latter does use a file descriptor any time you establish a connection. However, locks need no special support from the kernel. Also in GC'd setup file descriptors would be GC'd in pre (or post) morterm via some finalization mechanism, however relying on the GC to perform resource management is a terrible practice.

[0]: https://github.com/openjdk/jdk/blob/master/src/java.base/sha...

Re:Chris Lattner on garbage collection vs. Automatic Referen... by tialaramex on Sunday April 24, 2022 @10:55PM (#31150362)
> I don't quite get the continued argument

I keep telling you that, in fact, these primitives can literally be OS resources such as the semaphores from the BeOS system call create_sem() or the POSIX sem_open or Windows CreateSemaphore.

Your insistence that these don't have a dependency on the kernel, that they're just memory to be garbage collected is wrong, they aren't, this won't work.

You propose the Java ReentrantLock class as an example, but, that's just a thin wrapper for the underlying Java runtime parking mechanism, so, sure it's just a Java object no big deal, but the actual implementation (which is not in the file you just linked) requires an OS primitive that you've not examined at all, that OS primitive is being managed by the runtime (via the "Unsafe" interface) and is excluded from your garbage collection entirely.

In essence you get to "just" garbage collect these locks because they're only a superficial Java language shadow of the real mechanism, which you aren't allowed to touch and can't garbage collect.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by xxs on Monday April 25, 2022 @02:54AM (#31151349)
>requires an OS primitive that you've not examined at all, that OS primitive is being managed by the runtime (via the "Unsafe" interface) and is excluded from your garbage collection entirely.

This is most definitely false. The methods needed are the compare-and-set + LockSupport/park (parkNanos) and LockSupport.unpark. The former is a standard CPU instruction w/o any special magic about and the latter is setting the current thread to sleep and being awaken.

As for examine: I know how j.u.c works down the OS calls and generated assembly. Unsafe is a class (not an interface), albeit mostly resulting in compiler magic.

The use of unsafe is solely for: LockSupport::park/unpark and AbstractQueuedSynchronizer::compareAndSet. ReentrantLock is NOT any thing wrapper.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by tialaramex on Monday April 25, 2022 @03:43AM (#31151584)
> As for examine: I know how j.u.c works down the OS calls and generated assembly.

And here's the big reveal. It's actually calling the OS for "setting the current thread to sleep and being awaken" ie it's just using the OS locks and those are hidden from you so that you can't garbage collect them.

> Unsafe is a class (not an interface), albeit mostly resulting in compiler magic.

Unfortunate choice of language, I didn't mean a Java interface, but an interface in the broader sense. I assure you that "setting the current thread to sleep" is not "compiler magic", it's just using the OS locks, on a modern system it will presumably use a lightweight lock but on older systems it'll be something more heavyweight like the semaphores we saw earlier.

The claim that LockSupport, which is calling the OS is not a wrapper is bogus.

But all this is a distraction, even on systems where old semaphore APIs are now rarely needed they still exist and if you hold one you are still responsible for cleaning it up properly even if you think you know better.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by xxs on Monday April 25, 2022 @04:33AM (#31151865)
There is a single OS call to put the current thread to sleep; I mentioned it much earlier - a single pthread_mutex_t per Thread NOT per lock

Those are not any part of the developer capability to manage, aside starting the thread (and locking on it). The mutex is released with the thread, itself; Technically hotspot impl java does not ever releases them back to the OS but keeps a free-list. The thread is a lot larger OS resource as well. No new OS resources are exhausted by the OS b/c of the extra locking.

>The claim that LockSupport, which is calling the OS is not a wrapper is bogus.

Of course it does call the OS; it happens on the dormant part (w/o an OS call it'd a busy spin), or if a thread needs to be awaken. I said not a 'thin' wrapper. All the locking and queueing mechanism is outside the OS. The major distinction is there is only a single OS primitive per Thread NOT per lock. (Edit: now I see I have spelled thin as 'thing' which is a definite mistake on my part)

  /*
   * This is the platform-specific implementation underpinning
   * the ParkEvent class, which itself underpins Java-level monitor
   * operations. See park.hpp for details.
   * These event objects are type-stable and immortal - we never delete them.
   * Events are associated with a thread for the lifetime of the thread.
   */
https://github.com/openjdk/jdk/blob/c4c76e2f34f7e709f8b3c960...

  // ParkEvents are type-stable and immortal.
  //
  // Lifecycle: Once a ParkEvent is associated with a thread that ParkEvent remains
  // associated with the thread for the thread's entire lifetime - the relationship is
  // stable. A thread will be associated at most one ParkEvent.  When the thread
  // expires, the ParkEvent moves to the EventFreeList.  
https://github.com/openjdk/jdk/blob/739769c8fc4b496f08a92225...

Edit: My point has always been that locks/monitors/semaphores/etc. dont need any special care in a GC-setup as they can be implemented purely in the language itself, and without special care to release them, and manage them similar to file descriptors. The need to block (become dormant) obviously requires OS calls and support but that part doesn't have to scale with the amount of locks/semaphores/latches/etc. created.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by tialaramex on Monday April 25, 2022 @01:45PM (#31158261)
> now I see I have spelled thin as 'thing' which is a definite mistake on my part

That does make a lot more sense. I agree that what's going on here is not merely a thin wrapper.

> My point has always been that locks/monitors/semaphores/etc. dont need any special care in a GC-setup as they can be implemented purely in the language itself

And my point was always that you can only depend upon this if you in fact are always using the "implemented purely in the language itself" mechanisms, while plenty of others exist and you might need them - but you can't just treat them as garbage safely.

So overall I think we were mostly talking at cross purposes.

Actually looking at the Java stuff reminded me of m_ou_se's thread about how big boost::shared_mutex is (it's 312 bytes). Most people who need one of these synchronization primitives only really need the one that costs 4 bytes, but it's hard to keep saying "No" to people who want to add features. They're always confident that everybody will love their feature, at the cost of a little more memory, and it spirals out of control.

On most systems the pthread_mutex_t you mentioned is already 40 bytes. A "nightly" Rust can do a 32-byte array with a mutex to protect it, all inside 40 bytes.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by 12thwonder on Saturday April 23, 2022 @11:44PM (#31141118)
like Chris said in the article, it is difficult for GC languages to interop with C/C++ codebase.

in addition, if your system requires precise control over when and when not to use CPU, like resource-intensive gaming, browsers, OS, then GC may not be a good choice.

lastly, if you are using GPU via graphics API, I do not know any API that can garbage collect GPU memory but RC can naturally extend memory cleanup code to cleanup GPU memory as well quite easily.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by davnn on Sunday April 24, 2022 @12:44AM (#31141361)
CUDA.jl apparently uses Julia‘s GC to free up GPU resources, see https://cuda.juliagpu.org/stable/usage/memory/
Re:Chris Lattner on garbage collection vs. Automatic Referen... by 12thwonder on Sunday April 24, 2022 @01:51AM (#31141605)
good to know, thanks!

I personally would like to know when the GPU resources become available (freed) thus still inclined to prefer RC over GC tho.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by kazinator on Monday April 25, 2022 @02:40AM (#31151283)
No it isn't. Chris put his foot in his mouth and went on about how an advantage of garbage collection is that it moves objects. Not all garbage collection moves objects. Garbage collection that does not move objects does not have any such interop problem. Furthermore, even GC that does move objects can avoid that particular interop problem if it simply avoids moving foreign objects. E.g. suppose a foreign object is managed by some gc-heap object of type "foreign pointer". That managing object can be moved during GC, but if the actual foreign pointer doesn't change. If that pointer is all that the foreign code knows about, then there is no problem. Don't give foreign code any pointers to your heap objects and you're good.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by hmlongco on Tuesday April 26, 2022 @06:08PM (#31173775)
Uh... I can solve entire batches of problems by just saying, "don't do that and you're good."

Unfortunately, real-world constraints always seem to get in the way...

Re:Chris Lattner on garbage collection vs. Automatic Referen... by nine_k on Saturday April 23, 2022 @11:40PM (#31141107)
Think about the typical heap size for a GC-based language. It's usually 50-70% larger than a working set, to let GC run efficiently.
Re:Chris Lattner on garbage collection vs. Automatic Referen... by throwaway2037 on Sunday April 24, 2022 @11:06AM (#31144718)
To be clear, in enterprise (non-embedded / non-mobile) programming, this is fine. Money (RAM) isn't the issue. Programmers with domain knowledge are much more expensive than adding more hosts or RAM. I am talking about the general case; I know HN loves to focus on "high performance / low latency", but that is less than 1% in "Enterprise Real World".
Re:Chris Lattner on garbage collection vs. Automatic Referen... by kazinator on Monday April 25, 2022 @02:59AM (#31151373)
I don't know if there is a typical heap size.

My TXR Lisp is garbage collected. When I blow away all the compiled files of the standard library and run a rebuild, in a separate window running top, I do not ever see a snapshot of any txr process using more than 27 megs of RAM:

This is close to the worst-case observed:

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  19467 kaz       20   0   27364  24924   3112 R 100.0  1.2   0:30.55 txr
When this is happening, the library code is being interpreted as it compiles itself, it by bit. E.g. when stdlib/optimize.tl is being compiled, I see this 27 megs usage. But after the entire library is compiled, if I just "touch stdlib/optimize.tl" to force that to rebuild, it's a lot leaner; I see it hit about 16 megs.

Sitting at a REPL prompt, compared to some bash processes, using ps -aux:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
  USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
  kaz       2433  0.0  0.0   8904  1900 pts/0    Ss   Feb22   0:00 -bash
  kaz       6179  0.0  0.2   9072  4212 pts/1    Ss+  Apr22   0:01 -bash
  kaz      18551  0.0  0.1  11152  3932 pts/2    Ss+  Feb22   1:32 -bash
  kaz      18836  0.0  0.1   9064  2196 pts/5    Ss+  Apr13   0:02 -bash
  kaz      19079  0.0  0.2  13464  4880 pts/3    Ss   Mar01   0:40 -bash

  kaz      19849  0.1  0.2   9360  6024 pts/4    S+   23:45   0:00 txr
Oh, and that's the regular build of TXR. If that's too bloated, you can try CONFIG_SMALL_MEM.

Large is as large does.

Garbage collection was once used on systems in which most of today's software would not fit.

Garbage collection does have waste. You allocate more than you need, and keep it.

Precise, manual memory management does the same thing. Firstly, the technique of keeping around memory is practiced under manual memory management. E.g. C programs keep objects on recycle lists instead of calling free. And free itself, will not release memory to the OS, except in certain circumstances. Then there is internal fragmentation. Generally, programs that "get fat" during some peak workload will stay that way.

If you see some garbage collected system need hundreds of megabytes of RAM just for a base image, it may not be the GC that's to blame, or not entirely: it's all the bloated crap they are pulling into the image. Or it could also be that the GC was tuned by someone under thirty who doesn't think it's weird for a browser with three tabs open to be taking 500 megs. GC can be tuned as badly as you want; you can program it not to collect anything until the VM footprint is past the physical RAM available.

Re:Chris Lattner on garbage collection vs. Automatic Referen... by hmlongco on Tuesday April 26, 2022 @06:17PM (#31173856)
"it may not be the GC that's to blame, or not entirely: it's all the bloated crap they are pulling into the image"

Again, you keep waving your hands in the air and saying if you don't do that, you'll be fine.