$ -weight: 500;">systemctl -weight: 500;">status myapp
● myapp.-weight: 500;">service - My Java Application Loaded: loaded (/etc/systemd/system/myapp.-weight: 500;">service; enabled) Active: failed (Result: signal) since Tue 2026-01-20 14:23:15 UTC Jan 20 14:23:15 app-server-01 systemd[1]: myapp.-weight: 500;">service: Main process exited, code=killed, signal=KILL
Jan 20 14:23:15 app-server-01 systemd[1]: myapp.-weight: 500;">service: Failed with result 'signal'.
$ -weight: 500;">systemctl -weight: 500;">status myapp
● myapp.-weight: 500;">service - My Java Application Loaded: loaded (/etc/systemd/system/myapp.-weight: 500;">service; enabled) Active: failed (Result: signal) since Tue 2026-01-20 14:23:15 UTC Jan 20 14:23:15 app-server-01 systemd[1]: myapp.-weight: 500;">service: Main process exited, code=killed, signal=KILL
Jan 20 14:23:15 app-server-01 systemd[1]: myapp.-weight: 500;">service: Failed with result 'signal'.
$ -weight: 500;">systemctl -weight: 500;">status myapp
● myapp.-weight: 500;">service - My Java Application Loaded: loaded (/etc/systemd/system/myapp.-weight: 500;">service; enabled) Active: failed (Result: signal) since Tue 2026-01-20 14:23:15 UTC Jan 20 14:23:15 app-server-01 systemd[1]: myapp.-weight: 500;">service: Main process exited, code=killed, signal=KILL
Jan 20 14:23:15 app-server-01 systemd[1]: myapp.-weight: 500;">service: Failed with result 'signal'.
$ dmesg | grep -i oom
[482341.234] myapp invoked oom-killer: gfp_mask=0x100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
[482341.234] Out of memory: Killed process 8921 (java) total-vm:6291456kB, anon-rss:4194304kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:8192kB oom_score_adj:0
[482341.235] oom_reaper: reaped process 8921 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
$ dmesg | grep -i oom
[482341.234] myapp invoked oom-killer: gfp_mask=0x100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
[482341.234] Out of memory: Killed process 8921 (java) total-vm:6291456kB, anon-rss:4194304kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:8192kB oom_score_adj:0
[482341.235] oom_reaper: reaped process 8921 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
$ dmesg | grep -i oom
[482341.234] myapp invoked oom-killer: gfp_mask=0x100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
[482341.234] Out of memory: Killed process 8921 (java) total-vm:6291456kB, anon-rss:4194304kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:8192kB oom_score_adj:0
[482341.235] oom_reaper: reaped process 8921 (java), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
$ ps aux --sort=-%mem | head
USER PID %CPU %MEM RSS COMMAND
mysql 2341 15.2 45.5 3728000 /usr/sbin/mysqld
root 3456 5.1 28.3 2320000 /usr/bin/prometheus
elastic 4567 8.4 18.2 1490000 /usr/share/elasticsearch/jdk/bin/java
$ ps aux --sort=-%mem | head
USER PID %CPU %MEM RSS COMMAND
mysql 2341 15.2 45.5 3728000 /usr/sbin/mysqld
root 3456 5.1 28.3 2320000 /usr/bin/prometheus
elastic 4567 8.4 18.2 1490000 /usr/share/elasticsearch/jdk/bin/java
$ ps aux --sort=-%mem | head
USER PID %CPU %MEM RSS COMMAND
mysql 2341 15.2 45.5 3728000 /usr/sbin/mysqld
root 3456 5.1 28.3 2320000 /usr/bin/prometheus
elastic 4567 8.4 18.2 1490000 /usr/share/elasticsearch/jdk/bin/java
$ cat /proc/2341/oom_score
456
$ cat /proc/8921/oom_score
512
$ cat /proc/2341/oom_score
456
$ cat /proc/8921/oom_score
512
$ cat /proc/2341/oom_score
456
$ cat /proc/8921/oom_score
512
ExecStart=/usr/bin/java -Xmx2g -jar /opt/myapp/app.jar
ExecStart=/usr/bin/java -Xmx2g -jar /opt/myapp/app.jar
ExecStart=/usr/bin/java -Xmx2g -jar /opt/myapp/app.jar
$ echo -500 > /proc/$(pidof java)/oom_score_adj
$ echo -500 > /proc/$(pidof java)/oom_score_adj
$ echo -500 > /proc/$(pidof java)/oom_score_adj
[Service]
ExecStart=/usr/bin/java -Xmx2g -jar /opt/myapp/app.jar
MemoryMax=2.5G
MemoryHigh=2G
[Service]
ExecStart=/usr/bin/java -Xmx2g -jar /opt/myapp/app.jar
MemoryMax=2.5G
MemoryHigh=2G
[Service]
ExecStart=/usr/bin/java -Xmx2g -jar /opt/myapp/app.jar
MemoryMax=2.5G
MemoryHigh=2G - A human with -weight: 600;">sudo (ask around)
- A monitoring tool with an auto-remediation rule (check)
- The kernel itself - Use cgroups / systemd MemoryMax= to enforce limits per -weight: 500;">service. This is the proper fix. Each -weight: 500;">service gets a guaranteed ceiling. If it exceeds its own cgroup limit, it gets killed inside its cgroup (via oom_kill_disable=0) without taking the whole box down. - Move workloads off shared hosts. Put the DB on its own box, the app servers on theirs. Stop co-locating memory-hungry services.
- Monitor memory pressure, not just memory usage. /proc/pressure/memory (PSI) tells you when processes are stalled waiting for memory, which is a much earlier signal than "out of memory" alerts. - Every -weight: 500;">service has a MemoryMax= in its systemd unit
- Alert on memory available < 10% for 5 minutes, not just on events after death
- Alert on memory PSI (avg10 > 10) - catches swapping and thrashing before OOM
- Java apps have -XX:+HeapDumpOnOutOfMemoryError so you get something when the JVM itself runs out of heap (different from OS OOM)
- Document which processes are "protected" (oom_score_adj < 0) and why - Do you know SIGKILL can't be caught, so absence of logs is a clue, not a failure?
- Do you go to dmesg without being told to?
- Can you explain why the kernel kills processes (overcommit, not "a bug")?
- Do you talk about cgroups as the structural fix, not just tuning oom_score_adj?
- Can you distinguish OS-level OOM from JVM-level OutOfMemoryError?