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

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

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

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

パフォーマンス

コード効率の向上や計算に関する質問には、このタグを使ってください。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

2回答

5606閲覧

Javaのパフォーマンスチューニング

f650gs

総合スコア6

Java

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

パフォーマンス

コード効率の向上や計算に関する質問には、このタグを使ってください。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2017/03/13 17:04

■概要
Tomcat上で動作しているWebアプリが急にスローダウンする現象が発生し、原因追及に困っております。
スレッドダンプの状態などからアプリケーションのロジックそのものより、Java自体で問題が発生していないかを疑っています。
なにか原因や対策として思いつくものがありましたら教えていただけないでしょうか。

■事象
・LoadAverageが上昇(通常時:0.5、スローダウン時:3~5)
・CPUはuserのみが占有(IOやswapは問題なし)
→ほぼTomcatが利用している
・マイナーGCも秒単位でかかるようになる(通常時:0.1ミリ秒以下、異常時:3秒前後)
・しばらくするとTomcatの再起動なしでも復旧する
・複数台のサーバでほぼ同時に発生(アクセスが集中する時間に発生するケースが多い)
・スレッドダンプを取得するとSystem.getProperty()内で呼ばれているHashtable.get()でロック待ちが多数発生
→デッドロックではない模様

■環境情報
OS:Redhat 7.3 64bit
Java:1.7.0_80
Java起動オプション:
-Xms3072m
-Xmx3072m
-Xss800k
-XX:MaxPermSize=192m
-XX:+UseParallelGC
-XX:+UseParallelOldGC
-XX:SurvivorRatio=6
-XX:TargetSurvivorRatio=90
-XX:MaxTenuringThreshold=32
-XX:NewRatio=2
-XX:-UseCodeCacheFlushing
-XX:ReservedCodeCacheSize=256m
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintHeapAtGC
-XX:+PrintClassHistogram
-XX:+HeapDumpOnOutOfMemoryError

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

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

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

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

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

guest

回答2

0

・スレッドダンプを取得するとSystem.getProperty()内で呼ばれているHashtable.get()でロック待ちが多数発生

この部分が気になりました。
Hashtable.get()はsynchronizedメソッドのため、複数スレッドからのアクセスがあった場合、
待ち合わせが発生するのは当然なのですが、待ち合わせが多数発生するほどアクセスが集中するのは、
一般的なのでしょうか?(詳しくないので疑問です。)

System.getProperty()の呼び出しがTomcatで多数実行されていて、
webアプリでは実行されていないのであれば、回避しようがないのですが、
読み取り(get)しか行っていないという条件付きで、待ち合わせを回避する方法として、
・シングルトンなクラスを作成しgetterのみ用意する。
・または、HashMapに入れなおして保持する。
などが、可能かと思われます。

Tomcatで実行されいる気がするため、あまりいい回答ではないかと思いますが、
ご参考までに。

投稿2017/03/14 08:07

sugar_yas

総合スコア135

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

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

0

参考情報

  • JavaVMのメモリ管理に関するまとめ

http://blog.pepese.com/entry/20120508/1336467306

...
3.マイナーGCが1秒を超える場合

New領域が大きすぎる可能性があるので、-XX:NewSize、-XX:MaxNewSizeを減らす。
CPUが複数ある(マルチコアを含む)場合は、-XX:+UseParallelGC オプションでパラレルGCを有効にする。
-XX:+UseParallelGC マイナーGCをマルチスレッドで実行
....

投稿2017/03/13 21:42

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問