Есть ли у вас монтирование на основе SHM, такое как /tmp
или /var/tmp
? Возможно, создаются временные файлы, которые потребляют память даже после завершения процесса. Эти файлы будут оставаться в памяти до тех пор, пока они не будут удалены или система не будет перезагружена. Проверьте монтирование в /etc/fstab
, а также в mount
на наличие записей в tmpfs.
Также проверьте ротацию журнала, так как он может создавать большие файлы в каталоге temp. Возможно, стоит очистить журнал, если вы используете systemd. Например:
journalctl --vacuum-size=500M
Магия!
В частности, оболочка будет вилкой (2)
сама; это приводит к двум (в основном) идентичным копиям процесса оболочки; в частности, дочерний процесс оболочки наследует копию стандартного ввода от родительского процесса оболочки:
* The child inherits copies of the parent’s set of open file descrip-
tors. Each file descriptor in the child refers to the same open
file description (see open(2)) as the corresponding file descriptor
in the parent. This means that the two descriptors share open file
status flags, current file offset, and signal-driven I/O attributes
(see the description of F_SETOWN and F_SETSIG in fcntl(2)).
Затем дочерний процесс оболочки вызовет exec (3)
для запуска java
, что то есть процесс дочерней оболочки заменяет себя на java
. Посредством этого вызова java
получает копии файловых дескрипторов, унаследованных от родителя, и может воздействовать на стандартный ввод, таким образом переданный ему.
(Могут возникнуть сложности, если для файлового дескриптора установлен флаг «close on exec», но это не значение по умолчанию для стандартных, таких как стандартный ввод.)
Кроме того, если родительская оболочка не должна оставаться в стороне в памяти, пока выполняется java
, код может быть записан как:
#!/bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
exec java -jar $DIR/../bin-java/opsin/opsin.jar ${@:1}
Таким образом, java
заменяет родительский процесс оболочки вместо того, чтобы оставлять процесс оболочки без необходимости оставаться в памяти.
Для получения более подробной информации, Advanced Programming in the Unix Environment (APUE) содержит несколько глав, посвященных различным системным вызовам fork, exec, dup и pipe.