로컬 봇 경쟁을위한 생산자-소비자 설정에 문제가 있습니다 ( Scalatron을 생각 하지만 더 많은 언어가 허용되고 파이프를 사용하여 stdin 및 stdout에 연결). 항목은 잘 생성되고 소비자가 올바르게 처리하지만이 설정에서 소비자의 작업은 너무 많은 메모리를 차지할 수있는 다른 소프트웨어 조각을 호출하여 메모리 부족 오류가 발생합니다.
나는 Python 스크립트 (즉 소비자)가 subprocess.call
. 이들은 모두 평가를 위해 다른 사람들에 의해 제출되었지만, 때때로 제출 된 조각 중 하나가 너무 많은 메모리를 사용하고 엔진이 OutOfMemoryError를 생성하여 전체 스크립트가 중지되도록합니다.
사용 된 설정에는 세 개의 레이어가 있습니다.
소비자는 두 개의 봇을 인수로 사용하여 게임 엔진을 호출합니다
subprocess.call(['setsid', 'sudo', '-nu', 'botrunner', '/opt/bots/sh/run_bots.sh', bot1, bot2])
.
게임 엔진 내부에서 루프가 실행되어 봇을 서로 맞대고, 나중에 모든 데이터가 데이터베이스에 저장되어 플레이어가 봇을 검토 할 수 있습니다. 아이디어는 봇이 오류를 유발하면 오류를 기록하고 상대방에게 승리를 거두는 것입니다.
그래도 이것을 잡을 올바른 장소는 무엇입니까? 이것은 "최고"(즉, 소비자) 수준에서 수행되어야합니까, 아니면 게임 엔진 자체에서 수행되어야합니까?
Java에서 Exception
또는 Error
Java 를 잡을 올바른 위치 는이를 처리하고 일부 복구 단계를 수행하는 메커니즘이있는 위치입니다. 의 경우 OutOfMemoryError
오류를 정상적으로 닫고 리소스를 깨끗하게 해제하고 가능한 경우 실패 이유를 기록 할 수 있는 경우 에만 오류를 포착해야 합니다.
OutOfMemoryError
힙의 나머지 자원으로 만족할 수없는 블록 메모리 할당으로 인해 발생합니다. OutOfMemoryError
throw 될 때마다 할당 시도가 실패하기 전에 할당 된 개체의 정확히 동일한 수를 힙에 포함합니다. 이것은 정리에 필요할 수있는 더 많은 메모리를 확보하기 위해 런타임 개체에 대한 참조를 삭제 해야하는 실제 시간이어야 catch
합니다 OutOfMemoryError
.
JVM이 프로그램을 통해 확인할 수없는 복구 가능한 상태이면 오류를 복구하고 계속할 수도 있습니다. 그러나 이것은 프로그램을 통해서는 결코 결정할 수 없다고 말했기 때문에 일반적으로 좋지 않은 디자인으로 간주됩니다 .
당신이 볼 수있는 경우 문서 의를 java.lang.Error
, 그것은 말한다
오류는 합리적인 응용 프로그램이 포착하지 않아야하는 심각한 문제를 나타내는 Throwable의 하위 클래스입니다.
의도적으로 오류를 발견하는 경우 코드의 모든 부분 을 덮지 마십시오catch(Throwable t) {...}
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다