一回のスレッドの運用が適切でないことを記録して、Tomcat JVMは崩壊してhs_を生みますerr_pid.log解決プロセス


前言
tomcatがクライアントサーバ上で1ヶ月以上実行されるたびにクラッシュします.その後tomcatは自動的に停止し、hs_を生成します.err_pid.logファイル.
説明
元のサーバでtomcatクラッシュが発生したため、何が原因でクラッシュし、どのくらいクラッシュしたのか分からない.それに気づかなかったpid.logファイルは、再起動操作を行うだけです.その後、サーバを交換し、再配置しました.でもやはり崩壊して、今度はpidに気づきました.logファイルを分析したところ、解決の原因が見つからなかった.
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 533160 bytes for Chunk::new
# Possible reasons:
#   The system is out of physical RAM or swap space
#   In 32 bit mode, the process size limit was hit
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Use 64 bit Java on a 64 bit OS
#   Decrease Java heap size (-Xmx/-Xms)
#   Decrease number of Java threads
#   Decrease Java thread stack sizes (-Xss)
#   Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
#  Out of Memory Error (allocation.cpp:323), pid=5452, tid=4920
#
# JRE version: Java(TM) SE Runtime Environment (7.0_40-b43) (build 1.7.0_40-b43)
# Java VM: Java HotSpot(TM) Server VM (24.0-b56 mixed mode windows-x86 )
# Failed to write core dump. 

このログの前の部分の分析によると、メモリ不足によるものです.当時は不思議なことに、どうしてメモリ不足を引き起こすのか、従来のプロジェクトでは、あまりメモリを必要としなかったので、ましてサーバーのメモリは32 Gで、どうしてもメモリ不足を引き起こすことはありませんでした.(当時javaが32為だったことに気づかなかった)
Java Threads: ( => current thread )
  0x491d1c00 JavaThread "Timer-919" daemon [_thread_blocked, id=4840, stack(0x00110000,0x00190000)]
  0x491d1800 JavaThread "Timer-915" daemon [_thread_blocked, id=5244, stack(0x7fee0000,0x7ff60000)]
  0x491d1000 JavaThread "Timer-914" daemon [_thread_blocked, id=4928, stack(0x00050000,0x000d0000)]
  0x491cd000 JavaThread "Timer-913" daemon [_thread_blocked, id=5200, stack(0x7fd40000,0x7fdc0000)]
  0x491d0800 JavaThread "Timer-912" daemon [_thread_blocked, id=11684, stack(0x7fe60000,0x7fee0000)]
  0x491ccc00 JavaThread "Timer-911" daemon [_thread_blocked, id=6312, stack(0x7fba0000,0x7fc20000)]
  0x491d0400 JavaThread "Timer-910" daemon [_thread_blocked, id=8736, stack(0x7fcc0000,0x7fd40000)]
  0x491cfc00 JavaThread "Timer-909" daemon [_thread_blocked, id=8556, stack(0x7fa00000,0x7fa80000)]
  0x491cd800 JavaThread "Timer-908" daemon [_thread_blocked, id=12128, stack(0x7fb20000,0x7fba0000)]
  0x491cec00 JavaThread "Timer-907" daemon [_thread_blocked, id=6568, stack(0x7f860000,0x7f8e0000)]
  0x491cdc00 JavaThread "Timer-906" daemon [_thread_blocked, id=10204, stack(0x7f980000,0x7fa00000)]
  0x491cf000 JavaThread "Timer-905" daemon [_thread_blocked, id=5100, stack(0x7f7a0000,0x7f820000)]
  0x491cc400 JavaThread "Timer-904" daemon [_thread_blocked, id=1740, stack(0x7f6e0000,0x7f760000)]

また、原因が分からず、900以上のTimerスレッドが作成されていることがわかりました.でもタイミングはSpringのタイミングで、自分で書いたTimerではありません.
問題を発見する
Timerスレッドを作成しすぎたので、プロジェクトで検索して、どこが作成されたかを見て、見つけました.
    @Scheduled(cron="0 0 0/1 * * ?")  //   
	public void init() {
		Map map = queryEmail();
		String str = queryWarning();
		String user = map.get("monitorSenderMail");
		if(null==user){
			try {
				Thread.sleep(60*60*1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		String  password =map.get("monitorSenderPass");
		String  toaddress = map.get("monitorRecieverMail");
		String emailstmp = map.get("emailstmp");
		String emailport = map.get("emailport");
		String theme = "  ";
		Timer timer = new Timer(true);
		timer.schedule(new WriteWarning(str),0,1000*60*60);  //1     warning.txt     
		timer.schedule(new SendEmail(user, password, toaddress, theme,emailstmp,emailport),0,1*60*60*1000);  //1          
	}

このコードは、springタイマを使用して、1時間に1回呼び出されます.そして私は....(私はもう何も言わないから、変えましょう)
その後、お客様のtomcat構成に
set JAVA_OPTS=-server -Xms128M -Xmx512M -Xss512k

そして、なぜ1ヶ月以上で1回崩壊し、1時間に1つのスレッドを作成し、1日24個、1ヶ月で700余り、各スレッド512 K、結果は言うまでもない.... 
 
解決策
1.コードを修正し、springタイミングのみで、Timerスレッドを作成しない
2.tomcat構成を変更する32のjavaのため現在直接設定-Xmx 1024 M