Java 웹 프로그래밍에서 가상 메모리(리눅스 파일 시스템의 스왑)를 사용하는 방법

StackOverflow https://stackoverflow.com/questions/1506634

문제

저는 Java 웹 애플리케이션에서 일하고 있습니다.일부 섹션에서는 메모리(RAM)에 저장하고 유지하는 매우 거대한 트리 변수를 사용합니다.이것을 가상 메모리(스왑)로 마이그레이션할 수 있습니까?메모 :거대한 트리는 Ajax 텍스트 상자 제안에 사용되는 모든 사용자의 이름과 이메일로 구성됩니다.

도움이 되었습니까?

해결책

Linux에는 메모리 블록을 스왑하도록하는 표준 방법이 없으므로 JVM은 OS에 그러한 작업을 수행하도록 요청하는 방법이 없습니다.

이 기능을 원한다면 최선을 다하면 트리를 직렬화하고 원시 데이터를 디스크 파일에 작성한 다음 준비가되면 다시 가져 오는 것입니다.

하지만 디스크에 글을 쓰는 것은 극도로 물리적 메모리 I/O와 비교할 때 느리게.

예를 들어, OS가 이것에 대해 걱정하게하십시오. 당신보다 메모리를 더 잘 관리하는 방법을 알고 있다고 가정하는 것은 안전합니다.

다른 팁

사용자가 사용하는 OS가이를 처리하도록하십시오.

부분적으로 교환을하는 실행중인 Java 이미지는 죽은 Java 이미지입니다. 충분한 GC가 시작 되 자마자, 당신은 모든 것을 다시 방문 할 수 있습니다. 페이지는 충분히 나쁘다. 실제로 모든 것에 대한 RAM이 충분하지 않으면 서버의 스 래싱, 반응이없는 난파선으로 끝납니다. PAGED Java는 나쁘다 (TM).

모든 것에 대한 RAM이 충분하다면 스왑이 전혀 필요하지 않습니다.

목록을 데이터베이스 테이블, 디스크의 디스크, 색인, 결과 세트를 제한하고 적절한 쿼리를 작성하십시오. 순 승리가 될 것이며 DB는 가장 좋아하는 페이지를 캐시 할 수 있으므로 생각할 필요가 없습니다.

또는 더 많은 램을 얻으십시오.

OS는 자체 메모리를 자동으로 관리하고 필요에 따라 스왑 파일로 물건을 밀어 넣습니다.

데이터가 많은 경우 데이터를 거대한 메모리 트리 대신 데이터베이스에 저장하는 것을 고려할 수 있습니다. 이렇게하면 응용 프로그램 규모가 향상 될 수 있으며 성능을 향상시킬 수도 있습니다. 레코드를 찾거나 수정해야 할 때마다 전체 구조를 디스크에 읽고 쓰는 것보다 더 나은 성능을 제공 할 수 있습니다.

편집 : 반드시 전용 데이터베이스 컴퓨터를 설정할 필요는 없습니다. 현재 모든 데이터를 메모리에 저장하려고한다는 점에서 HSQLDB 또는 sqlite, 크기 제한은 각각 16GB 및 2TB입니다.

모든 사람들이 디스크에 품목을 저장하는 것이 끔찍하게 부족하다고 말하고 있다는 것이 흥미 롭습니다. 동시에 재조정하는 동시에 그는 데이터베이스를 사용합니다.

스왑 파일을 맹목적으로 처리 할 때 스왑 파일이 미래가 무엇인지 아는 코드의 영향을받는 것보다 시스템이 더 효율적이라고 가정합니다. 시스템이 메모리의 모든 항목을보고 해당 파일에 효율적으로 넣으려고 시도하는 것보다 한동안 사용되지 않을 메모리를 교체하는 것이 훨씬 더 효율적입니다.

물론 틀린 동안 당신은 모두 다소 옳습니다. 로컬 데이터베이스는 데이터를 파일에 저장하는 가장 효율적인 방법입니다 (서면 및 읽기). 로컬 데이터베이스에 액세스 할 수없는 경우 코드를 코딩하십시오. 해시 맵은 메모리에 저장되도록 설계되었으며 정렬 된 인덱스 링크 목록은 디스크에 저장되도록 설계되었습니다. 두 매체의 효율에 대한 고려없이 메모리에서 디스크로 직접 푸시하려고하는 것은 효과적이지 않습니다.

동일한 문제에 대한 다른 해석은 어떻습니까?저는 서버 측에서 많은 PDF를 작성하고 있으며 일반적으로 매월 같은 시간에 보고서를 실행하기를 원하는 수십, 수천 명의 클라이언트를 보유하고 있습니다.평균 PDF 크기는 7-10Mb일 수 있습니다.제한된 힙을 사용할 수 있는 경우 PDF 데이터를 클라이언트에 스트리밍하기 전에 응답의 콘텐츠 길이를 설정할 수 있어야 하기 때문에 데이터를 임시 파일로 '교환'하는 것이 PDF를 만드는 유효한 방법입니다.

단순히 디자인에 대해 의문을 제기하는 대신 몇 가지 유용한 옵션이 도움이 될 수도 있습니다.개인적으로 저는 프로세스당 하나의 임시 파일을 사용하거나 단일 '스왑' 파일에 대한 동시 액세스를 사용하려고 합니다.

무엇을 제안하시겠습니까?

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