Scala v2.11.4로 작성된 Play Framework v2.3.7에 응용 프로그램이 있습니다. 서버에서 실행 중이며 일주일에 한 번 OutOfMemoryError : GC 오버 헤드 제한 초과 예외와 함께 충돌합니다. 나는 거기에서 무엇이 잘못되었는지 알아 내려고 노력하고있다. 메모리 덤프를 만들고 사용 된 모든 클래스의 히스토그램을 만들었습니다 (사용 jmap -histo
). 그리고 나는 매우 이상한 결과를 발견했습니다.
Object Histogram:
num #instances #bytes Class description
--------------------------------------------------------------------------
1: 24023 787570032 scala.concurrent.forkjoin.ForkJoinTask[]
2: 96965 12420368 * MethodKlass
3: 96965 11250824 * ConstMethodKlass
4: 8424 8652552 * ConstantPoolKlass
5: 8424 7547640 * InstanceKlassKlass
6: 61739 5531288 char[]
7: 7527 4799776 * ConstantPoolCacheKlass
8: 24024 4612608 scala.concurrent.forkjoin.ForkJoinPool$WorkQueue
9: 27289 3543672 byte[]
10: 23190 2597280 scala.concurrent.impl.ExecutionContextImpl$DefaultThreadFactory$$anon$2
11: 63921 2045472 java.util.concurrent.ConcurrentHashMap$HashEntry
12: 3735 1470112 * MethodDataKlass
13: 42877 1029048 scala.collection.immutable.$colon$colon
14: 8834 1023064 java.lang.Class
그래서, 인스턴스가 많이있다 ForkJoinTask[]
및 ForkJoinPool$WorkQueue
. 따라서 모든 비동기 호출 및 앱 스레드에 대한 대기열 및 작업이라고 가정합니다. 그리고 이론적으로는 완성 된 후 바로 제거해야한다고 생각합니다.
이 문제의 가능한 원인은 무엇입니까? ExecutionContext를 잘못 구성했을 수 있습니까? 이전에이 문제에 직면 한 사람이 있습니까?
이 문제는 "scala-reflect"라이브러리의 최신 버전 (2.11.6 이후 버전)을 사용하여 해결되었습니다.
val scalaV = "2.11.6"
scalaVersion := scalaV
libraryDependencies ++= Seq(
"org.scala-lang" % "scala-reflect" % scalaV
)
다음은 버그 설명입니다. https://issues.scala-lang.org/browse/SI-8946
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다