Java 캐시 데이터 손실 : 캐시에서 데이터를 검색 할 수없는 이유는 무엇입니까?
Java 캐시 데이터 손실 문제 : 진단 및 솔루션
Java 응용 프로그램에서 메모리 캐싱은 성능 향상을위한 핵심 전략입니다. 그러나 캐시 된 데이터 손실은 일반적인 문제입니다. 이 기사는 Java 캐시 된 데이터의 근본 원인을 깊이 탐색하고 효과적인 최적화 솔루션을 제공하기 위해 사례 분석을 수행합니다.
사례 배경 :
프로젝트는 scenarioBuffer
라는 클래스를 사용하여 약 160,000 asset
데이터를 해시 맵으로 캐시합니다. scenarioBuffer
클래스는 @Component
주석을 사용하고 데이터 수집을위한 정적 메소드 getBAsset
제공합니다. 응용 프로그램이 시작되면 scenarioBuffer
ApplicationRunner
인터페이스를 통해 캐시를 초기화합니다. 그러나 실행 중에 getBAsset
메소드는 종종 NULL 값을 반환합니다. 더 혼란스러운 것은 서버 메모리가 긴급한 필요하다는 것입니다 (100MB의 사용 가능한 메모리 만 남아 있고 캐시는 3GB를 차지하고 총 메모리는 8GB입니다). 서버를 다시 시작하고 캐시를 지우면 문제가 일시적으로 해결됩니다.
문제의 근본 원인 분석 :
Tomcat에 대해 약 3GB의 메모리를 할당하더라도 서버 메모리가 불충분 한 주요 문제입니다. 메모리가 충분하지 않으면 JVM은 쓰레기 수집을 트리거하고 심지어 메모리를 해제하기 위해 강제 종료조차도 캐시 된 데이터가 지워집니다.
코드 결함 :
원래 코드에는 다음과 같은 문제가 있습니다.
- 정적 메소드 및 싱글 톤 :
scenarioBuffer
클래스는 정적 메소드getBAsset
및 정적 변수assetBuffer
와getInstance()
메소드를 사용합니다. 봄 관리 콩에서는 완전히 불필요합니다. 스프링 컨테이너 자체는 콩의 싱글 톤, 정적 방법 및 변수는 코드 복잡성을 증가시키고 단위 테스트가 어렵습니다. - 종속성 주입이 누락되었습니다 :
scenarioBuffer
인스턴스를 얻는 데는 Spring의 종속성 주입을 사용하지 않지만getInstance()
메소드를 사용하여 코드의 유지 관리 및 테스트 가능성이 줄어 듭니다. - 초기화 방법 :
ApplicationRunner
사용하여 캐시를 초기화하는 것이 가능하지만@PostConstruct
주석 또는InitializingBean
인터페이스는 명확하고 이해하기 쉽습니다.
최적화 솔루션 :
Spring의 종속성 주입 및 @PostConstruct
주석 최적화 코드를 사용하는 것이 좋습니다.
수정 된 scenarioBuffer
클래스 :
@요소 공개 클래스 시나리오 버퍼는 iCectionListener { @autowired 개인 IASSETSERVICE ASSETSERVICE; 개인지도 <string list> > assetbuffer = New Hashmap (); @PostConstruct public void init () { 목록<asset> assetlist = assetservice.list (); assetbuffer.put ( "키", assetlist); // 여기에서 실제 상황에 따라 키를 수정해야합니다. } 공개 목록<asset> getBasset (String GroupId) { Return AssetBuffer.get (GroupId); } }</asset></asset></string>
캐시를 사용해야하는 클래스에서 @Autowired
통해 scenarioBuffer
인스턴스를 주입하십시오.
@서비스 공개 클래스 xxxservice { @autowired 개인 시나리오 버퍼 시나리오 버퍼; 공개 void xxx () { 목록<asset> asset = shacenariobuffer.getBasset ( "xxx"); // 여기에서 실제 상황에 따라 GroupID를 수정해야합니다. // ... } }</asset>
이러한 수정을 통해 코드를보다 간결하고 유지 관리 및 테스트하기 쉽고 정적 방법과 변수로 인한 문제를 피합니다.
또한 서버 메모리 사용에주의를 기울여야합니다. 메모리가 종종 불충분 한 경우 서버 메모리를 늘리거나 메모리 사용을 줄이기 위해 프로그램 최적화를 고려하십시오. Redis는 당분간에 고려되지 않지만 장기적으로는 장기적으로 Redis와 같은 분산 캐시를 사용하면 메모리 압력을 효과적으로 완화하고 성능을 향상시킬 수 있습니다.
위 내용은 Java 캐시 데이터 손실 : 캐시에서 데이터를 검색 할 수없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











vprocesserazrabotkiveb-enclosed, мнепришлостольносться악 · 뇨 зейейерациигоглапи혁 맥발 추배. LeavallysumballancefriAblancefaumdoMatification, čtookazalovnetakprosto, Kakaožidal.posenesko

Redis 캐싱 솔루션은 제품 순위 목록의 요구 사항을 어떻게 인식합니까? 개발 과정에서 우리는 종종 a ... 표시와 같은 순위의 요구 사항을 처리해야합니다.

WordPress 호스트를 사용하여 웹 사이트를 구축하려면 다음과 같이 필요합니다. 신뢰할 수있는 호스팅 제공 업체를 선택하십시오. 도메인 이름을 구입하십시오. WordPress 호스팅 계정을 설정하십시오. 주제를 선택하십시오. 페이지와 기사를 추가하십시오. 플러그인을 설치하십시오. 웹 사이트를 사용자 정의하십시오. 귀하의 웹 사이트를 게시하십시오.

요약 설명 : 분산 잠금은 고 동시성 응용 프로그램을 개발할 때 데이터 일관성을 보장하기위한 핵심 도구입니다. 이 기사는 실제 사례에서 시작하여 작곡가를 사용하여 Dino-MA/Distributed-Lock 라이브러리를 설치하고 사용하여 분산 잠금 문제를 해결하고 시스템의 보안 및 효율성을 보장하는 방법을 자세히 소개합니다.

JDBC ...

SpringBoot에서는 redis를 사용하여 Oauth2authorization 객체를 캐시하십시오. SpringBoot 응용 프로그램에서 springsecurityoauth2authorizationserver를 사용하십시오 ...

PHP 프로젝트를 개발할 때는 종종 데이터베이스의 빈번한 운영, 트랜잭션 관리 및 종속성 주입과 같은 요구 사항이 발생합니다. 수동으로 작성된 경우, 이러한 작업은 시간이 많이 걸리고 노동 집약적 일뿐 만 아니라 오류가 발생하기 쉽습니다. 최근에 저는 프로젝트에서 비슷한 문제를 겪었으며 이러한 운영을 처리하는 것은 매우 복잡하고 유지 관리가 어려워졌습니다. 다행히도 PXNIU/Study라는 작곡가 라이브러리를 발견하여 개발 프로세스를 크게 단순화했습니다. 작곡가는 다음 주소를 통해 배울 수 있습니다. 학습 주소

배치 쿼리에 redistemplate을 사용할 때 반환 값이 비어있는 이유는 무엇입니까? 배치 쿼리 작업에 redistemplate를 사용하는 경우 반환 된 결과가 발생할 수 있습니다 ...
