첫째, Perm 공간과 힙 공간의 차이점은 무엇입니까 (JVM은 각 메모리 공간을 사용하기 위해 무엇을 어떻게 선택합니까)?
둘째, 가장 중요한 것은 표준 MVC 유형 Java 응용 프로그램에 어떤 종류의 비율이 권장됩니까?
답변:
힙 저장하는 자바 프로그램에 의해 생성 된 모든 객체. 힙의 내용은 가비지 수집기에 의해 모니터링되며, 객체 사용을 중지하면 (즉, 객체에 대한 더 이상 참조가 없을 때) 힙에서 메모리를 해제합니다.
이것은 int 및 chars와 같은 기본 유형을 저장하고 일반적으로 지역 변수 및 함수 반환 값인 stack 과 대조 됩니다. 이들은 가비지 수집되지 않습니다.
파마 공간은 힙의 특별한 부분을 말한다. 설명은이 SO 답변을 참조하십시오 : 파마 공간이란 무엇입니까?
-XX:MaxPermSize=256m
perm 공간 크기를 256MB로 설정하려면 명령 행 옵션 으로 perm 공간 크기를 늘리십시오.
개인적으로 저는 PermGen을 힙의 특별한 부분이라고 생각하지 않습니다.
저는 힙을 객체 인스턴스 저장 전용 메모리 영역으로 생각하고 PermGen은 클래스 정의 저장 전용 영역으로 생각하는 것을 선호합니다. 결과적으로 힙의 수명주기는 애플리케이션에 연결되고 PermGen의 수명주기는 JVM에 연결됩니다.
애플리케이션과 JVM이 서로 다른 라이프 사이클을 가질 수있는 가장 좋은 예 중 하나는 Java EE 컨테이너에 있습니다. 앱 서버에서는 서버를 다시 시작하지 않고도 애플리케이션을 배포 및 배포 취소 할 수 있습니다. 배포 해제 (또는 재배포) 동안 모든 개체 인스턴스 (예 : 힙 공간)를 해제하는 것은 쉽지만 일부 클래스는 여전히 JVM에서 참조 할 수 있기 때문에 PermGen에서이 앱이로드 한 모든 클래스를 지우는 것은 다소 까다 롭습니다.
그러한 경우 중 하나가 누수 드라이버 입니다. 앱이 배포되면 JDBC 드라이버가로드되고 DriverManager에 등록됩니다. 이 앱이 배포 해제되면 DriverManager는 드라이버, 원래 클래스 로더 및이 클래스 로더가로드 한 모든 것에 대한 참조를 유지하고 유지합니다. 결과적으로 PermGen에서 메모리 누수가 발생하지만 응용 프로그램의 메모리 관리에 문제가있는 것은 아닙니다.
JRocket과 같은 JVM에는 PermGen이 전혀 없으며 모든 것이 힙에 저장되는 것은 사실입니다. 이러한 컨텍스트에서만 PermGen을 힙의 "특수 부분"이라고 부를 수 있습니다. 그럼에도 불구하고 우리는 PermGen과 힙이 매우 다른 목적을 가지고 있고 매우 다른 유형의 메모리 누수를 가지고 있기 때문에 다르게보아야합니다.
업데이트 : Oracle의 JDK 8에서 PermGen은 "Metaspace"로 대체되었으며 이제 공식적으로 힙의 일부입니다. 더 이상 PermGen을 특별히 조정할 필요가 없습니다.