초당 60 회 호출되는 메인 루프가있는 매우 복잡한 자바 스크립트 앱을 사용하고 있습니다. Chrome 개발자 도구의 Memory 타임 라인에서 출력되는 'sawtooth'를 기반으로 한 가비지 수집이 많은 것처럼 보입니다. 이는 종종 애플리케이션의 성능에 영향을줍니다.자바에서 가비지 콜렉터 활동을 줄이는 모범 사례
그래서 가비지 수집기가 수행해야하는 작업량을 줄이는 모범 사례를 연구하려고합니다. (웹에서 찾을 수 있었던 대부분의 정보는 약간 다른 질문 인 메모리 누수를 피하는 것과 관련이 있습니다. 메모리가 사라지고 있습니다. 쓰레기 수거가 너무 많습니다.) 나는 추측하고 있습니다. 이것은 대부분 객체를 가능한 한 많이 재사용한다는 것이지만 악마는 세부 사항에 포함됩니다.
앱은 John Resig's Simple JavaScript Inheritance 줄을 따라 '클래스'로 구성됩니다.
한 가지 문제점은 몇 가지 기능이 초당 수천 번 호출 될 수 있다는 것입니다 (주 루프 반복마다 수백 번 사용됨). 아마도 이러한 함수의 로컬 작업 변수 (문자열, 배열 , 등) 문제가 될 수 있습니다.
나는 더 크고 무거운 물체에 대한 객체 풀링에 대해 알고 있습니다. (그리고 우리는이 정도를 사용합니다.) 특히 보드라는 이름의 함수와 관련하여 전반적으로 적용 할 수있는 기법을 찾고 있습니다. 시간이 긴 루프.
가비지 수집기에서 수행해야하는 작업량을 줄이기 위해 사용할 수있는 기술은 무엇입니까?
그리고 아마도 어떤 기술이 가비지 수집 대상이되는 개체를 식별하는 데 사용될 수 있습니까? (매우 큰 코드베이스이기 때문에 힙의 스냅 샷을 비교하는 것이 효과적이지는 않습니다.)
우리에게 보여줄 수있는 코드의 예가 있습니까? 그 질문에 대답하기가 더 쉬워 질 것입니다. (덜 일반적이기 때문에 여기서는 확실하지 않습니다.) –
외부 범위에서 변수를 사용하고 다시 사용할 수 있으므로 매번 다시 만들지 않아도됩니다. 예를 들어'var x = "longstring";을 루프에 넣으면 수천 개의 "longsting"이 생성되지만, 하나의 "longstring"만 생성됩니다. – Paulpro
초당 수천 번 실행 기능을 중지하는 것은 어떻습니까? 이것이 정말로이 문제에 접근하는 유일한 방법입니까? 이 질문은 XY 문제처럼 보입니다. 당신은 X에 대해 설명하고 있지만 실제로 찾고있는 것은 Y에 대한 해결책입니다. –