JVM 객체 액세스 해결
객체 액세스 프로세스의 메모리 상태public void function(){
Object obj = new Object();
}
function 방법이 실행될 때, JVM은 JVM 창고에서 function을 위한 창고 프레임을 만들고, function이 실행 중인 정보를 저장하는 데 사용됩니다.Object obj가 실행되면 JVM은 function 메서드에 해당하는 스택 프레임의 로컬 변수 테이블에서 Object 유형의 참조 obj를 만듭니다.새 Object()가 실행될 때 JVM은 인스턴스 데이터 값을 포함하는 구조화된 Object 유형의 메모리를 무더기 메모리에 만듭니다.PS: 서로 다른 유형에 대응하는 이 구조화된 메모리의 길이는 다르다.
대상이 접근하는 방식이 서로 다른 가상 기기의 대상 접근 방식은 다르다. 주류의 접근 방식은 두 가지가 있는데 그것이 바로 핸들을 사용하여 실례 데이터에 간접적으로 접근하고 지침을 사용하여 실례 데이터에 직접 접근하는 것이다.a) 포인터가 인스턴스 데이터에 직접 액세스하는 경우 JVM 스택의 스택 프레임에 있는 로컬 변수 테이블에 저장된 참조 주소가 인스턴스 데이터의 주소입니다.이 인용을 통해 실례 데이터의 주소를 직접 얻을 수 있습니다.그 밖에 사실 인용이 가리키는 메모리에 있는 대상 데이터는 두 부분으로 구성되어 있는데 하나는 이 대상의 실례 자체이고 다른 하나는 대상 유형이 방법구에 있는 주소이다.b) 인스턴스 데이터에 대한 핸들 간접 액세스를 사용하는 JVM은 클러스터의 메모리를 핸들 풀로 분할합니다. JVM 스택의 스택 프레임에 있는 로컬 변수 테이블에 저장된 참조 주소는 객체 자체의 주소가 아니라 객체에 해당하는 핸들 주소입니다.핸들 탱크의 하나의 대상 주소는 두 부분으로 구성되어 있는데 하나는 대상 데이터가 메모리에 있는 실례 탱크의 주소이고 다른 하나는 대상 유형이 방법 구역에 있는 주소이다. 앞에서 말한 바와 같이 핸들 탱크는 하나의 중계소에 해당하고 우리가 조회하고자 하는 실례 대상 데이터는 간접 인덱스를 통해 얻어야 한다.지침의 직접 접근은 중계소가 필요 없고 인용이 가리키는 것은 방문할 실례 대상 데이터이다.
그 밖에 어떤 대상의 접근 방식이든 인용이 가리키는 메모리의 데이터는 두 부분으로 구성되어 있는데 그 중 일부는 반드시 방법 영역의 대상 유형을 가리키는 지침이다.
두 가지 대상 접근 방식의 장점 a) 핸들 접근 대상의 장점 접근 대상은 핸들 바늘을 통해 간접 인덱스를 한 번 한 후에 대상 실례 데이터가 이동될 때(쓰레기를 회수할 때 일부 대상이 이동할 수 있음) 핸들 탱크에 있는 대상 실례의 주소만 바꾸면 된다. 인용과 핸들 탱크의 대응 관계를 바꾸지 않아도 되기 때문에 인용에 저장된 것은 안정적인 핸들 주소이다.b) 포인터가 직접 대상을 방문하는 장점 이런 방식의 가장 큰 장점은 대상을 방문하는 속도가 매우 빠르다는 것이다. 마우스를 통해 대상을 방문하는 것보다 주소 찾기 시간을 절반 절약했다. 자바에서 대상의 방문이 매우 빈번하기 때문에 이런 방식은 많은 주소 찾기 시간을 절약할 수 있다. OOM 예외 해결
메모리를 쌓은 OOM 이상 a)는 어떻게 발생합니까?더미 메모리는 실례 대상을 저장하는 데 사용된다. 우리가 대상을 계속 만들고 대상이 인용 지향(GC Roots에서 대상 사이에 도달할 수 있는 경로가 있음)을 가지면 쓰레기 회수 메커니즘은 이 대상을 정리하지 않고 대상이 더미 메모리를 가득 채운 상한선에 이르면 OOM 이상이 발생한다.b) OOM 이상 PS 시뮬레이션: eclipse의 Arguments에서 VM arguments를 설정할 수 있습니다. 이것이 바로 JVM의 일부 매개 변수입니다.Xms: 스택의 최소값 설정 - Xmx: 스택의 최대값 설정public class A(){
public static void main(String[] args){
while(true){
new Person();
}
}
}
; c) 어떻게 해결합니까?메모리 이미지 분석 도구 사용: Eclipse Memory Analyzer는 Dump에서 나온 덤프 저장 스냅샷을 분석하는데 메모리의 대상이 필요한지 확인하는 데 중점을 둔다. 즉, 메모리가 누출되었는지 메모리가 넘쳤는지 확인하는 것이다.PS: 메모리 유출로 인한 OOM: new에 나오는 많은 대상은 필요하지 않지만 인용 지향이 있기 때문에 쓰레기 회수 메커니즘은 회수할 수 없습니다.PS: 메모리 넘침: new에서 나오는 대상은 모두 필요하지만 메모리가 너무 작아서 설치할 수 없습니다.메모리 누출의 경우 GC Roots에 대한 참조 체인을 도구로 볼 수 있습니다.누설 대상이 어떤 경로를 통해 GC Roots와 연관이 있는지를 찾아내면 스팸 수거 메커니즘이 자동으로 수거되지 못하게 된다.만약 메모리 유출이 존재하지 않는다면, 즉 모든 대상이 반드시 존재해야 하며, 이때 메모리를 축적해야 한다.
JVM 창고와 로컬 방법 창고의 OOM 이상 a)Stack OverFlow Error는 스레드가 요청한 창고 깊이가 가상 머신이 허용하는 최대 창고 깊이보다 크면 이 이상을 던집니다.b) OutOfMemeoryError 가상 머신이 스택을 확장할 때 충분한 공간의 메모리를 요청할 수 없으면 이 예외가 발생합니다.PS: 이 두 가지 이상은 같은 문제에 대한 두 가지 설명입니다.단일 스레드에서 창고 프레임이 너무 크든 가상 머신 창고 용량이 너무 작든 메모리를 분배할 수 없을 때 가상 머신이 던지는 것은 Stack Over Flow Error이다.테스트를 통해 모든 스레드의 JVM 창고에 할당된 메모리가 클수록 큰 창고 프레임이 이 JVM 창고에도 들어갈 수 있다는 것을 발견했다. Stack Over Flow Error는 줄어들어야 하지만 사실은 정반대이다. 각 스레드의 JVM 창고가 클수록 만들 수 있는 스레드 수가 적고 몇 개의 스레드를 조금만 만들면 유한한 메모리 자원을 다 소모할 수 있다. 상시 풀을 실행하는 OOM 이상은 String 클래스의 인터넷 () 방법을 통해 방법 영역의 상시 풀에 내용을 추가합니다.인터넷 방법의 역할은 상수지에 이string 형식에 대응하는 문자열이 있으면 이 문자열의 인용을 되돌려주는 것이다.상수도에 이 문자열이 없으면 이 문자열을 상수지에 추가하고 이 문자열의 인용을 되돌려줍니다. 메소드 영역의 OOM 예외 a)는 어떻게 발생합니까?방법 구역에 저장된 것은Class와 관련된 정보입니다. 예를 들어 클래스 이름, 방문 수식자, 상수도 풀, 필드 설명, 방법 설명 등입니다.만약 대량의 클래스가 발생하면 방법구를 가득 채워서 방법구의 OOM 이상이 발생할 수 있다.b) 주의점 방법 구역의 OOM 이상은 매우 흔한 것이다. 특히 일부 동적 생성 대량의Class 응용 프로그램(JSP)에서는 클래스의 회수에 특히 주의해야 한다. 로컬 직접 메모리의 OOM 예외