質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

0回答

2304閲覧

常駐プロセスで発生するメモリリークの原因を追跡したいです。

ttdrop

総合スコア20

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2019/08/23 03:50

編集2019/08/27 01:34

お世話になります。

まず初めに、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; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問