2011-01-10 7 views
8

저는 리눅스에서 자바 프로세스가 얼마나 많은 메모리를 차지할 수 있는지 알아보기 위해 인터넷을 샅샅이 뒤졌습니다. (나는 힙에 대해서 말하고있는 것이 아니라, 자바가 차지하는 메모리의 전체 양을 )Linux에서 프로세스 메모리 제한을 확인하는 방법은 무엇입니까?

나는 그 머신에서 어떤 것을 실행할 권한이 없다. 따라서 메모리 부족 상태가 될 때까지 메모리를 소비하는 프로그램을 간단히 실행할 수는 없습니다.

그러나 설정 파일 등을 검사 할 수있는 권한이 있습니다 (예 : cat/proc/meminfo를 실행하려했지만 이해할 수 없지만 결과가 매개 변수를 나타내지는 않습니다 나는 대략 알고 싶다).

나는 프로그램을 실행할 권한이있는 별도의 빨간 모자 컴퓨터에서 자바 프로그램을 시험해 보았습니다. 자바 프로그램이 약 3GB까지 커지는 것을 볼 수있었습니다.

프로세스에서 얻을 수있는 메모리 용량을 알 수있는 방법이 있습니까?

답변

8

ulimit은 (는) 친구입니다. Java 프로세스는 다른 프로세스와 다를 바 없습니다. 그러나 ulimit -a를 실행할 수 없다면 질문에 대답하기가 어렵습니다.

+0

나는 "ulimit -a"를 실행했는데, 나는 그것을 시험해보기 위해 많은 옵션을 가지고 출력했다. 그래서 "ulimit -m"을 시도했는데, 결과는 "unimited"였습니다. 그게 무슨 뜻인지 모르겠지만 프로세스가 무제한의 메모리를 차지할 수 있다고 생각하지 않습니다. 그렇죠? – rk2010

+2

@ rk2010은 모든 프로세스에서 메모리 사용량에 대한 할당량이 없다는 것을 의미합니다. 하드 제한은 컴퓨터에있는 RAM 및 스왑 메모리의 양뿐입니다. –

+0

@ 마티스하지만 특정 프로세스가 3GB 이상의 메모리를 소비 할 수 없다는 것을 인터넷에 너무 많은 정보 (막연한 것)가있는 것으로 보입니다. 그것에 대한 당신의 견해는 무엇입니까? – rk2010

4

timeout 도구로 연결되는 유용한 읽을 거리는 다음과 같습니다. timeout 도구를 사용하면 시간이나 메모리 사용량에 따라 프로세스를 감금 할 수 있습니다.

2

나는이 정확한 문제를 다루었으며 2.6.24 이상을 사용하는 경우 cgroup/cgroups을 사용하는 것이 가장 좋은 해결책을 찾았습니다. 예를 들면 다음과 같습니다. 하단에 추가 된 제어 그룹이있는 기본 /etc/cgconfig.conf 파일이 있습니다. 이 제어 그룹은 실제 메모리의 양을 100MB로 제한하고 총 가상 메모리 할당을 200MB로 제한합니다. 나는이 구성되면

mount { 
    cpuset = /cgroup/cpuset; 
    cpu = /cgroup/cpu; 
    cpuacct = /cgroup/cpuacct; 
    memory = /cgroup/memory; 
    devices = /cgroup/devices; 
    freezer = /cgroup/freezer; 
    net_cls = /cgroup/net_cls; 
    blkio = /cgroup/blkio; 
} 

group daemons/java_limited_process { 
    memory { 
     memory.limit_in_bytes = "104857600"; 
     memory.memsw.limit_in_bytes = "209715200"; 
    } 
} 

, 나는 주요 프로세스의 메모리가 급부상 자식을 제한합니다 그래서

cgexec -g memory:daemons/java_limited_process /usr/local/tomcat/bin/startup.sh 

이 같은 그룹에 프로세스를 추가 할 수 있습니다. 또한 컨트롤러에서 메모리 사용을 쿼리하는 기능도 있습니다.

관련 문제