お世話になります。
まず初めに、Spring Bootを用いた実装経験が乏しい為、
情報不備や混乱を招く表現がありましたらご指摘ください。
●使用言語
Java11, Spring Boot
●検証環境
AWS EC2 RHEL-7.6
メモリ16GB
●事象
Javaで起動している常駐プロセスで、メモリリークが発生しています。
原因の切り分けを行うために、内部処理を取り除き
ログを1行分出力をするだけの処理にしても、メモリリークが解消されませんでした。
●検証内容
切り分け検証に実行しているプログラムは下記になります。
importに関しては元々の実装部分で読み込んでいたものになります。
また、名称などを[test]などに置き換えているため、実際のものとは少々異なります。
処理内容としては、
プロセスが常駐し、タスクスケジューラによって
3秒ごとに、ログを1行出力するものです。
このプログラムを30スレッドで起動し、メモリの遷移率を見ていたところ、
30分毎に0.1%ほど上昇し続けるような動きをしていました。
わずかながらですが、ゆるやかに上昇し続けており、メモリ使用率が下がらないという事象になります。
元々の内部処理に原因があると思っていたのですが、
この結果からするとタスクスケジューラの起動に問題があるのかなと思っているのですが、
この先の原因追及が出来ていない状態です。
GCがうまくいっていないのでしょうか。
何かお気づきの点がある方いらっしゃいましたら、ご指摘頂けると幸いです。
何卒宜しくお願い致します。
●プログラム
package jp.co.test.test2.request; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import jp.co.test.test2.request.tasklet.RequestTasklet; /** * タスクスケジューラー * * @author test * */ @Component public class TestScheduler { @Autowired private RequestTasklet requestTasklet; @Scheduled(initialDelay = 0, fixedDelayString = 3000) public void run() throws Throwable { requestTasklet.execute(); } }
package jp.co.test.test2.request.tasklet; import java.sql.Timestamp; import java.text.ParseException; import java.util.Arrays; import java.util.Locale; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.joda.time.DateTime; import org.springframework.batch.core.JobInterruptedException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import jp.co.test.base.core.AmazonSqsUtil; import jp.co.test.base.core.Properties; import jp.co.test.base.core.Constants; import jp.co.test.base.core.TestUtil; import jp.co.test.base.core.entity.testEntity; import jp.co.test.test2.request.dao.testRequestDao; /** * タスクスケジューラー * * @author test * */ @Component public class RequestTasklet { private final Log log = LogFactory.getLog(RequestTasklet.class); @Autowired MessageSource messagesource; @Autowired private Properties cp; @Autowired private testRequestDao dao; @Autowired private AmazonSqsUtil amazonSqsUtil; @Autowired private TestUtil testUtil; @Autowired private testEntity params; private boolean result = true; @Transactional @SuppressWarnings({ "unchecked", "unused" }) public void execute() throws Exception { log.info("ログ出力"); return; } }
あなたの回答
tips
プレビュー