我的应用程序是用java spring boot编写的,要在linux系统上运行该应用程序,我已经编写了一个systemd文件,如下所示。
[Unit]
Description=Service Module For microservice Service.
After=network.target auditd.service
[Install]
WantedBy=multi-user.target
[Service]
Type=idle
Environment=service_name=/home/ec2-user/test-1.0-SNAPSHOT.jar
Environment=env=dev
ExecStart=/usr/bin/java -jar ${service_name} \
--spring.profiles.active=${env} \
--Xmx=1300M \
-XX:+HeapDumpOnOutOfMemoryError \
-Xloggc:gc.log \
-XX:+PrintGCDetails \
-XX:+PrintGCTimeStamps \
-XX:+UseGCLogFileRotation \
-XX:NumberOfGCLogFiles=5 \
-XX:GCLogFileSize=10M
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=30000
Restart=always
RestartSec=500
StartLimitBurst=3
StartLimitInterval=120
MemoryLimit=1300M
[Manager]
当启动此systemd文件时,我可以在进程中看到进程正在按预期方式运行。
/usr/bin/java -jar /home/ec2-user/test-1.0-SNAPSHOT.jar --spring.profiles.active=dev --Xmx=1300M -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M
问题是,应用程序在日志中出现“ java.lang.OutOfMemoryError:Java堆空间”错误,并且未在指定位置导出堆转储和gc日志时失败。是否有人将jar与systemd一起使用并面临类似问题。
也许将WorkingDirectory=/home/ec2-user/
设置为希望日志/转储出现的目录。因为没有那个,我不确定systemd在哪里尝试创建您指定的gc.log。
或者,您可以尝试指定gc.log的完整路径:-Xloggc:/home/ec2-user/gc.log