Perm 공간과 힙 공간


79

첫째, Perm 공간과 힙 공간의 차이점은 무엇입니까 (JVM은 각 메모리 공간을 사용하기 위해 무엇을 어떻게 선택합니까)?

둘째, 가장 중요한 것은 표준 MVC 유형 Java 응용 프로그램에 어떤 종류의 비율이 권장됩니까?

답변:


80

저장하는 자바 프로그램에 의해 생성 된 모든 객체. 힙의 내용은 가비지 수집기에 의해 모니터링되며, 객체 사용을 중지하면 (즉, 객체에 대한 더 이상 참조가 없을 때) 힙에서 메모리를 해제합니다.

이것은 int 및 chars와 같은 기본 유형을 저장하고 일반적으로 지역 변수 및 함수 반환 값인 stack 과 대조 됩니다. 이들은 가비지 수집되지 않습니다.

파마 공간은 힙의 특별한 부분을 말한다. 설명은이 SO 답변을 참조하십시오 : 파마 공간이란 무엇입니까?


1
귀하가 제공 한 링크는 "힙의 세그먼트"라고되어 있습니다. 정말 "스택의 특별한 부분"입니까? 그런 종류의 일에 적합하지 않은 스택보다는 힙 (또는 일종의 정적 데이터 세그먼트)의 일부가되는 것이 훨씬 더 합리적입니다.
Sergei Tachenov 2011 년

1
힙의 특별한 부분입니다. 당신이 주석 전에 편집 내 대답을했지만 나는 :) 어쨌든 보정을 주셔서 감사합니다
Olhovsky

1
두 번째 질문에 대한 권장 사항이 있습니까?
Gareth

2
@Gareth : 이것은 걱정할 것이 아닙니다. 일부 JVM에는 perm 공간을위한 전용 메모리 섹션도 없습니다. java.lang.OutOfMemory 예외가 발생하면 alphaworks.ibm.com/tech/pmat 도구와 함께 사용되는 perm 공간을 시각화 한 다음 perm 공간이 부족한 경우 (내 경험상 드물게) 다음을 수행 할 수 있습니다. -XX:MaxPermSize=256mperm 공간 크기를 256MB로 설정하려면 명령 행 옵션 으로 perm 공간 크기를 늘리십시오.
Olhovsky

1
그래 알았어. 따라서 실제로 백분율 규칙이나 아무것도 없습니다. 감사.
Gareth

34

개인적으로 저는 PermGen을 힙의 특별한 부분이라고 생각하지 않습니다.

저는 힙을 객체 인스턴스 저장 전용 메모리 영역으로 생각하고 PermGen은 클래스 정의 저장 전용 영역으로 생각하는 것을 선호합니다. 결과적으로 힙의 수명주기는 애플리케이션에 연결되고 PermGen의 수명주기는 JVM에 연결됩니다.

애플리케이션과 JVM이 서로 다른 라이프 사이클을 가질 수있는 가장 좋은 예 중 하나는 Java EE 컨테이너에 있습니다. 앱 서버에서는 서버를 다시 시작하지 않고도 애플리케이션을 배포 및 배포 취소 할 수 있습니다. 배포 해제 (또는 재배포) 동안 모든 개체 인스턴스 (예 : 힙 공간)를 해제하는 것은 쉽지만 일부 클래스는 여전히 JVM에서 참조 할 수 있기 때문에 PermGen에서이 앱이로드 한 모든 클래스를 지우는 것은 다소 까다 롭습니다.

그러한 경우 중 하나가 누수 드라이버 입니다. 앱이 배포되면 JDBC 드라이버가로드되고 DriverManager에 등록됩니다. 이 앱이 배포 해제되면 DriverManager는 드라이버, 원래 클래스 로더 및이 클래스 로더가로드 한 모든 것에 대한 참조를 유지하고 유지합니다. 결과적으로 PermGen에서 메모리 누수가 발생하지만 응용 프로그램의 메모리 관리에 문제가있는 것은 아닙니다.

JRocket과 같은 JVM에는 PermGen이 전혀 없으며 모든 것이 힙에 저장되는 것은 사실입니다. 이러한 컨텍스트에서만 PermGen을 힙의 "특수 부분"이라고 부를 수 있습니다. 그럼에도 불구하고 우리는 PermGen과 힙이 매우 다른 목적을 가지고 있고 매우 다른 유형의 메모리 누수를 가지고 있기 때문에 다르게보아야합니다.

업데이트 : Oracle의 JDK 8에서 PermGen은 "Metaspace"로 대체되었으며 이제 공식적으로 힙의 일부입니다. 더 이상 PermGen을 특별히 조정할 필요가 없습니다.


0

힙에 할당 된 메모리에 이름을 지정할 수 없습니다.

이는 int x(이름)가 스택에 할당 되었음을 의미 합니다. 이름으로 포인터에 도달 할 수 있으므로 포인터가 스택에 있습니다. 이름이 없기 때문에 이름으로 개체에 도달 할 수 없습니다. (이름없는) 개체에 대한 액세스는 포인터를 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.