문제

메모리 제약 조건이있는 반 제축 장치에 응용 프로그램을 배포하고 있습니다. 우리가 할 수있는 모든 것을 저장하려고 노력합니다. 우리는 앱의 힙 덤프를 분석하고 가장 큰 소비자를 공격하고 있습니다.

우리는 스프링 DM 1.1과 함께 스프링 2.5를 사용하고 더 복잡한 스프링 컨텍스트가있는 일부 번들 중 일부는 XML에서 구문 분석 된 모든 beandefinition을 포함하는 전체 객체 그래프를 유지하는 것처럼 보이기 때문에 상당히 메모리를 사용하고 있음을 알 수 있습니다. . 앱이 초기화되고 모든 것이 주입되면이 중 대부분이 불필요하다고 가정합니다.

이 동작을 제어 할 수있는 스프링에 대한 구성 옵션이 있습니까? 낮은 메모리 모드에서 실행 하시겠습니까? 불필요한 모든 것을 버리시겠습니까? 크기에 대한 거래 계산 시간?

도움이 되었습니까?

해결책

나는 팀원들이 이것을 더 깊이 살펴보고 흥미로운 결과를 얻었습니다. 기본 구성의 Spring은 메모리 사용에 특히 보수적 인 것에 관심이 없습니다. 상당한 이익을 위해 조정할 수있는 두 가지 기본 측면이 있습니다.

  • 첫 번째는 봄 내부에 노출되지 않은 속성입니다 OsgiBundleXmlApplicationContext 해당 클래스에서 연장하고 customizeBeanFactory 방법.

우리는 이것을 좋아했습니다.

@Override
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
    super.customizeBeanFactory(beanFactory);
    String cacheBeanMetadataSysProp = System.getProperty(CACHE_BEAN_METADATA, "true");
    if (cacheBeanMetadataSysProp != null
        && cacheBeanMetadataSysProp.equalsIgnoreCase("false")) {
        beanFactory.setCacheBeanMetadata(false);
    } else if (cacheBeanMetadataSysProp != null
        && cacheBeanMetadataSysProp.equalsIgnoreCase("true")) {
        beanFactory.setCacheBeanMetadata(true);
    }
}

"SetCacheBeanMetadata"속성을 설정합니다 false 원인 BeanDefinitions (기본적으로 XML 기반 구성의 프로그램 미러)는 초기화 후 폐기됩니다.

  • 현재 프로토 타입을 가지고있는 두 번째 변경 사항은 스프링 소스 코드가 컬렉션의 게으른 초기화를 수행하는 패치입니다. 콩과 모든 속성을 나타내는 많은 내부 스프링 객체에는 기본적으로 해시 맵 및 기타 컬렉션으로 초기화 된 많은 멤버가 있지만 데이터로 거의 채워져 있지 않습니다. 이 게으름을 초기화하기 위해 스프링 프레임 워크를 변경하면 또 다른 상당한 양의 메모리가 절약되지만 훨씬 더 침습적 인 변화입니다.

다른 팁

당신은 저장할 수 있습니다 약간 멍청한 메모리 - 참조 3.8.1. BeanFactory 또는 ApplicationContext:

ApplicationContext에는 BeanFactory의 모든 기능이 포함되어 있으므로, 메모리 소비가 중요 할 수 있고 몇 킬로바이트가 몇 킬로 바이트가 차이점.

나는 "빛"모드에서 스프링을 실행하는 방법을 모릅니다. beanfactorypostprocessor를 구현하고 컨텍스트에서 특정 콩을 제거하는 데 사용할 수 있습니다. 그러나 그것이 내부 스프링 오류로 이어질 지 모르겠습니다.

만약에 스타트 업에서만 스프링을 사용합니다. 모든 콩이 연결된 다음 응용 프로그램 컨텍스트 나 종료 로직이 필요하지 않으므로 앱을 시작한 다음 응용 프로그램 컨텍스트에 대한 모든 참조를 지울 수 있습니다.

스프링 구성이 AOP 및로드 타임 직조를 사용하는 경우 AOP.XML을 사용하여 1.6.5에 도입 된 SASPINGJ 유형 강등 기능을 사용하여 SAGONTJ에서 메모리를 되 찾을 수 있습니다.

<weaver options="-Xset:typeDemotion=true"/>

힙을 분석하십시오. 많은 reftype 객체를 찾으면 위의 속임수가 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top