Program Tip

간단한 "Hello World"는 64 비트 컴퓨터에서 10G 가상 메모리가 필요하고 32 비트에서는 1G가 필요합니까?

programtip 2020. 11. 13. 23:57
반응형

간단한 "Hello World"는 64 비트 컴퓨터에서 10G 가상 메모리가 필요하고 32 비트에서는 1G가 필요합니까?


프로덕션 머신에서 간단한 Java 프로그램을 실행하면서이 프로그램이 10G를 더 많이 차지한다는 것을 알았습니다. 나는 가상 메모리가 그다지 관련이 없다는 것을 알고 있지만, 적어도 이것이 왜 필요한지 이해하고 싶습니다.

public class Main {
  public static void main(String[] args) {
        System.out.println("Hello World!");
        try {
                Thread.sleep(10000);
        } catch(InterruptedException e) {
                /* ignored */
        }
  }
}

top이 작은 프로그램을 실행할 때 말하는 내용 은 다음과 같습니다.

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
18764 myuser    20   0 10.2g  20m 8128 S  1.7  0.1   0:00.05 java

왜 이런 일이 일어나는지 아는 사람이 있습니까?

uname -a 말한다 :

Linux m4fxhpsrm1dg 2.6.32-358.18.1.el6.x86_64 #1 SMP Fri Aug 2 17:04:38 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux

구형 32 비트 리눅스 머신에서 같은 프로그램은 약 1G의 가상만을 소비합니다. 이전 컴퓨터에는 4GB RAM이 있고 새로운 컴퓨터에는 32GB가 있습니다.


초기 힙 및 최대 힙기본 크기 는 머신의 물리적 메모리의 백분율로 정의되며, 오늘날 프로덕션 서버는이 중 많은 양을 차지하는 경향이 있습니다 .

-Xms 및 -Xmx 명령 줄 옵션을 통해 둘 다 선택할 수 있습니다 .


가상 메모리는 정말 중요하지 않습니다.

32 비트와 64 비트의 기본적인 차이점은 64 비트의 주소 공간이 엄청나게 크다는 것입니다. 10GiB가 많은 것 같으면 64 비트의 .NET이 이와 같이 TiB의 메모리를 사용할 수 있습니다. 그러나 32 비트에서 .NET은 훨씬 더 보수적입니다 (JVM도 그렇습니다). 주소 공간은 4GiB 입니다. 그다지 많지 않습니다.

그러나 그것은 관련이 없습니다-그것은 중요하지 않습니다. 프로그래밍을 크게 단순화하고 호스트 OS에 부정적인 영향을 미치지 않는 것입니다. VM이 사용할 연속 주소 공간을 생성합니다. 즉, 힙을 조각화 할 필요가 없습니다 (또는 스택이 다소 불가능하지만 MiB 정도만되는 경향이있는 경우). 더 많은 "실제"메모리가 필요합니다. 마지막으로 가상 메모리를 커밋하면 약간 더 실제가됩니다. 그 시점 에서 페이지 (스왑) 파일이든 물리적 RAM이든 어느 정도 데이터 스토리지에 의해 백업 되어야합니다.

요점은 메모리의 물리적 위치가 반드시 연속적이지는 않지만 도달 범위 밖에서 수행되며 매핑이 일반적으로 매우 빠르다는 것입니다. 반면에, 실제로 10 개의 서로 다른 가상 주소 메모리 블록에 걸쳐 조각화 된 배열을 인덱싱해야하는 것은 (완전히 필요하지 않은) 작업입니다.

따라서 가상 메모리는 64 비트에서 거의 무료입니다. 기본 접근 방식은 "있는 경우 사용"입니다. 다른 응용 프로그램을 제한 하지 않으며 실제로 사용하게 되면 작업을 상당히 절약 할 수 있습니다. 하지만 그 시점이 올 때까지 당신은 예약 만하시면됩니다. 물리적 메모리로 전혀 변환되지 않습니다. 당신은 오늘 밤에 와서 당신의 테이블에 앉을 수있는 친구에 대한 비용을 지불하지 않지만, 그들이 오면 그들이 앉을 수있는 공간을 여전히 가지고 있습니다. 그리고 그들이 마침내 올 때만 당신은 실제로 "충전"을받습니다.

Java가 다른 시스템과 다른 버전에서 작동하는 방식에 대한 자세한 내용은이 질문을 참조하십시오. Java SE 6에서 Sun JVM의 기본 최대 힙 크기는 얼마입니까? 힙은 연속적인 주소 공간이어야하므로 최대 힙 크기는 예약 된 가상 메모리의 양도 결정합니다. 미리 예약되지 않은 경우 힙이 확장되어야하는 위치에 다른 사람이 주소 공간 영역을 예약했기 때문에 힙이이 최대 값으로 확장되지 않을 수 있습니다.


해당 메모리를 사용하는 프로그램이 아니라로드되는 프로그램에 관계없이 해당 메모리를 예약하는 Java VM입니다.


가상 메모리 주소 지정 (응용 프로그램이 보는 "메모리 공간"이 실제로 물리적으로 할당 된 메모리와 관련이 없음)을 사용하는 최신 컴퓨터 아키텍처 에서이 가상 "메모리 공간의 양은 중요하지 않습니다." "는 시작시 응용 프로그램에 제공됩니다. 이 정도의 메모리가 시스템에 의해 할당되었음을 의미하지는 않습니다.

애플리케이션이 10GB의 가상 주소 공간을 발견 하면 원하는 경우 최대 10GB의 메모리 주소를 사용할 있다는 신호가 앱에 전달됩니다. 그러나 메모리는 실제로 기록 될 때까지 실제 RAM에 할당되지 않으며 페이지 단위로 수행됩니다. 여기서 페이지는 4kB 메모리 섹션입니다. 가상 주소 공간은 실제로 사용되기 전까지는 완전히 가상입니다.

애플리케이션에 10GB의 주소 공간이 제공되고 일부를 사용하기 시작한다고 가정 해 보겠습니다. 이 가상 메모리의 "새로 워진"(이전에 변경되지 않은) 페이지가 먼저 기록되면 시스템은 낮은 수준에서이 가상 페이지를 실제 메모리 섹션에 "매핑"한 다음 기록합니다. 그러나 해당 응용 프로그램 자체는 이러한 세부 사항에 대해 걱정할 필요가 없으며 가상 메모리 영역에 대한 전체 액세스 권한이있는 것처럼 작동합니다.

In the case of Java applications, it's not the application itself but Java that is allocated that address space, and Java simply requests a huge address space by default - the amount it requests is calculated relative to the physical memory size, but not because it has any need to be conservative, but just for practicality - an application is probably not going to want enough heap size to totally bring a server to its knees, so it's operating on the assumption it won't. As I said above this does not mean that this much is "allocated" or that the system has had to expend many resources doing so.


Imagine you're in the document storage business. You have a small facility in the middle of the city that stores boxes of papers, and a much larger warehouse outside of town with 1000 times the space. Every box has a label on it identifying its contents.

The in-city facility is main memory. The warehouse is disk space.

A 10GB virtual memory allocation for a new process doesn't mean finding room for 10 billion boxes for a new customer. It means printing 10 billion labels for boxes with contiguous ID numbers on them.


This is not the amount of physical memory the application is actually using. A virtual memory used by all processes can be orders of magnitude more than the amount of physical RAM on the machine, without any obvious problems.


Your program is NOT using so much memory. JVM / OS is reserving that memory i.e, the limit UPTO WHICH your program can use. Also, like one of the answer clearly mentions. 32 bit and 64 bit have got nothing to do with this. 32 bit means you can access upto 2^32 physical memory locations. and 64 bit means upto 2^64.

참고URL : https://stackoverflow.com/questions/23385471/a-simple-hello-world-needs-10g-virtual-memory-on-a-64-bit-machine-vs-1g-at-32

반응형