java 덤프와 창고의 차이 분석
Java 더미는 런타임 데이터 영역입니다.클래스(대상은 그 안에서 공간을 분배한다. 이 대상들은 new,newarray,anewarray,multianewarray 등의 명령을 통해 만들어진다. 프로그램 코드로 현저하게 방출할 필요가 없다. 더미는 쓰레기 회수로 책임진다. 더미의 장점은 메모리 크기를 동적으로 분배할 수 있다는 것이다. 생존 기간도 컴파일러에게 미리 알려줄 필요가 없다. 왜냐하면 실행할 때 동적으로 메모리를 분배하기 때문이다. 자바의 쓰레기 수집기는 더 이상 사용하지 않는 데이터를 자동으로 가져간다..그러나 실행할 때 메모리를 동적 분배해야 하기 때문에 접근 속도가 느리다는 단점이 있다.
창고의 장점은 저장 속도가 더미보다 빠르고 레지스터에 버금가며 창고 데이터를 공유할 수 있다는 것이다.그러나 창고에 존재하는 데이터의 크기와 생존 기간은 반드시 확정적이어야 하며 유연성이 부족하다는 단점이 있다.창고에는 기본 형식의 변수(,int,short,long,byte,float,double,boolean,char)와 대상 핸들이 저장되어 있습니다.
창고는 매우 중요한 특수성을 가지고 있는데, 바로 창고에 존재하는 데이터가 공유할 수 있다는 것이다.만약 우리가 동시에 정의한다면:
int a = 3;
int b = 3;
컴파일러가 inta=3을 먼저 처리합니다.우선 창고에 변수가 a인 인용을 만들고 창고에 이 값이 있는지 찾습니다. 만약 찾지 못하면 3을 저장하고 a를 3으로 가리킵니다.이어서 intb=3을 처리한다.b의 인용 변수를 만든 후, 창고에 이 값이 있기 때문에, b를 직접 3을 가리킨다.이렇게 해서 a와 b가 동시에 3을 가리키는 상황이 나타났다.
이때 a=4를 다시 시키면그러면 컴파일러는 창고에 4값이 있는지 다시 검색하고 없으면 4를 저장하고 a가 4를 가리키도록 합니다.만약 이미 있다면, 직접 a를 이 주소로 가리킨다.따라서 a값의 변화는 b값에 영향을 주지 않는다.
이러한 데이터의 공유는 두 대상의 인용과 동시에 한 대상을 가리키는 이런 공유와 다르다. 왜냐하면 이런 상황 a의 수정은 b에 영향을 주지 않고 컴파일러가 완성한 것이기 때문에 공간을 절약하는 데 유리하다.하나의 대상 인용 변수가 이 대상의 내부 상태를 수정하면 다른 대상 인용 변수에 영향을 줄 수 있다.
String은 특수 포장 데이터입니다.사용 가능:
String str = new String("abc");
String str = "abc";
두 가지 형식으로 만듭니다. 첫 번째는 new () 로 새 대상을 만듭니다. 이것은 더미에 저장됩니다.호출할 때마다 새 대상을 만듭니다.두 번째는 먼저 창고에 String 클래스에 대한 대상 인용 변수str를 만든 다음에 창고에'abc'가 있는지 찾고 없으면'abc'를 창고에 저장하고'abc'를 가리키며'abc'가 있으면'abc'를 가리킨다.
클래스 안의 수치가 같은지 비교할 때 equals () 방법을 사용합니다.두 포장류의 인용이 같은 대상을 가리키는지 테스트할 때 ==, 다음은 위의 이론을 예로 설명한다.
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
str1과str2가 같은 대상을 가리키는 것을 알 수 있다.
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
new의 방식은 서로 다른 대상을 생성하는 것이다.매번 하나를 생성한다.따라서 첫 번째 방식으로 여러 개의'abc'문자열을 만듭니다. 메모리에는 사실상 하나의 대상만 존재합니다.이런 작법은 메모리 공간을 절약하는 데 유리하다.또한 JVM은 자동으로 스택에 있는 데이터의 실제 상황에 따라 새 객체를 만들 필요가 있는지 여부를 결정하기 때문에 프로그램의 실행 속도를 어느 정도 높일 수 있습니다.Stringstr = new String("abc");코드는 문자열 값이 같든 같지 않든 새 대상을 만들 필요가 있든 상관없이 무더기에서 새 대상을 만들어 프로그램의 부담을 가중시킨다.
다른 한편, 주의: 우리는 Stringstr ='abc'와 같은 것을 사용하고 있다.형식 정의 클래스를 정의할 때, String 클래스를 만든 대상str를 당연하게 생각합니다.함정이 걱정이야!대상이 생성되지 않았을 수도 있습니다!이전에 작성된 객체만 가리킬 수 있습니다.new () 방법을 통해서만 매번 새로운 대상을 만들 수 있습니다.
String 클래스의immutable 성질 때문에 String 변수가 자주 그 값을 바꾸어야 할 때 프로그램 효율을 높이기 위해 String Buffer 클래스를 사용하는 것을 고려해야 한다.
본 논문이 여러분의 Java 프로그래밍 학습에 도움이 되기를 바랍니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.