알리 면접관 사랑 메모리 관리 및 GC 알고리즘 및 복구 전략을 물었다!

01 JVM 메모리 조성물 구조

도 1에 도시 된 구조로 이루어진 스택, 힙, 스택, 로컬 방법에있어서 공간 부에 의해 JVM 스택은 다음과 같다 :

의 image.png

02 JVM의 가비지 컬렉션

썬의 JVMGenerationalCollecting (가비지 컬렉션) 원칙은 이것이다 : 과목으로 나누어 한 젊은 세대 (영) , 이전 세대 (종신) , 영구 세대 (파마) 다른 알고리즘을 사용하여 서로 다른 라이프 사이클에 따라. (분석 대상의 수명주기에 따라)

의 image.png


1.Young (젊은 세대)

젊은 세대는 세 가지 영역으로 나누어 져 있습니다. 에덴 지역이 개 생존자 영역. 에덴 지역에서 발생하는 대부분의 객체. 에덴 영역이 가득 차면, 라이브 객체는 또한 생존자 영역 (이 일을)에, 생존자는이 지역이이 지역에 살고있는 객체가 다른 지역 생존자에 복사됩니다 가득 때 생존자 갈 때 복사됩니다 첫 번째 생존자 영역에서 복사 한 전체 시간은이 시간에 살아 와서 객체 (종신 오래된 지구 복사됩니다. 그것은 주목해야한다, 생존자는 두 영역의 대칭, 관계가없는이 있으므로 같은 지역은 첫 번째 생존자 각지에서 이동이 객체를 통해 에덴에서 복사 존재 할 수 있으며, 이전의 생존자의 개체는 복사와 물체의 옛 지역에 복사. 또한, 최고 생존자가 비어있다.

2.Tenured (구세대)

젊은 세대에서 살아남은 오래된 세대의 저장 영역 오브젝트. 일반적으로 이전 세대는 객체의 긴 수명에 저장됩니다.

3.Perm (영구 세대)

저장하는 데 사용 정적 파일 등등, 지금은 자바 클래스, 메소드 등을. 영구 세대 유의 가비지 컬렉션에 효과가 있지만, 일부 응용 프로그램은 새로운 클래스에서 실행 이러한 프로세스를 저장하는 비교적 큰 영구 세대 공간을 설정하려면이 시간 필요에서, 등 최대 절전 모드 같은 일부 또는 동적으로 생성 된 클래스를 호출 할 수 있습니다. 를 MaxPermSize가 = 설정 : -XX에 의해 영구 세대 크기입니다. 예를 들어 프로그램의 객체를 생성 할 때이 직접 생성 될 수있다 구세대 너무 큰 객체의 경우, 젊은 세대 공간 물체의 법선 할당은 (는 프로그램이 실행되는 때마다이 생성 것으로 관찰 공간 Shizhao,이 메모리 할당은 직접) 전송 및 이전 세대를 사용하여 메시지를 받게됩니다. 공간에서 젊은 세대는 가비지 수집을 시작합니다 완료되면, 대부분의 메모리 복구도 완료 메모리 영역에서 할당되어있는 경우 후 나중에 반복, 메모리의 남아있는 부분은 생존자의 영역에 복사됩니다 복구 할 수는 것입니다 할당 메모리는 회수 영역에 남은 객체 복사 발생한다. 이 지역은 또한 가득 찰 때까지 기다려야하기 위해, 가비지 컬렉션 다시 다음 이전 지구 객체의 복사본을 생존 발생합니다. 보통 우리는 JVM의 가비지 컬렉션은 항상 내용의 정말 만 힙이 응용 프로그램의 동적 할당하고, 힙 메모리의 회복을 의미 말, 젊은 세대와 이전 세대의 상기 목적은 JVM 힙 공간 및 영구 세대 언급하는 앞서 언급 한 MethodArea이며, 힙에 속하지 않습니다.

JVM 메모리 관리에 03 제안

(1) 수동 목적은 메모리 교정 속도를 중간 널로 설정되어, 불필요한 오브젝트를 생성. 오브젝트 생성 타겟 셀 기술이 재사용 가능한 개체 인 경우 (2), 속성은 단지 적은 세대 표적 세포에 따라 고려 될 다르다. 유휴 객체가 사용하는 풀에서 가져가있는 경우, 크게 객체의 재사용 성을 향상, 새로운 객체를 생성하지 않습니다. (3)이 더 메모리 누수없는 발생하고 JVM의 가비지 수집을 보장 할 수 없습니다 위의 두 가지 방법, 해결하기 위해 JVM 튜닝 방법을 사용하는 것이 좋습니다,하지만해야하는 경우, 속도를 개선하기 위해 JVM의 가비지 컬렉션을 구성하는 JVM 조정 매개 변수를 다른 매개 변수는 다른 결과로 이어질 수 있기 때문에, 물리적 기계의 장기 테스트를 통해 이동합니다. -Xnoclassgc 매개 변수를 설정합니다.

04 쓰레기 오브젝트 판단

Java 힙 객체의 거의 모든 인스턴스를 저장하기 전에, 재활용 힙에서 객체의 가비지 콜렉터는 객체가 다음의 알고리즘 쓰레기 객체로 결정되어 있는지, 이러한 개체 사용 여부를 결정해야한다

1. 레퍼런스 카운팅 알고리즘

고장을 참조 할 때 그 위치에 대한 참조는, 카운터 값이 1만큼 증가 할 때마다 개체 카운터에 대한 참조를 추가 카운터 값을 1 씩 감소되어, 언제든지 카운터 개체 0이 더 이상 사용되지 않는다. 효율성을 결정하는 간단한 계산 알고리즘의 참조 구현은 자바 언어는 객체 사이에 해결하기 매우 어렵습니다 주로하기 때문에, 가비지 컬렉션이 알고리즘을 선택하지 않은 좋은 선택은 대부분의 경우에, 또한 높은 상호 순환 참조 문제.

2. 루트 검색 알고리즘

자바와 C #은 객체 살아 있는지 여부를 확인하려면 루트 검색 알고리즘을 기반으로합니다. 이 알고리즘의 기본 개념은 이러한 노드에서 아래쪽으로 검색을 시작하는 출발점으로 "GC의 뿌리"라는 개체의 일련의 참조라는 검색 경로 통과 체인 인 객체가 뿌리를 GC에 대한 참조가 없을 때 체인에 연결되어있을 때, 오브젝트에 의해 입증 할 수 없습니다. 자바 언어에서 현금으로 GC 뿌리는 다음과 같은 범주를 포함한다 :

  • 객체 참조의 가상 머신 스택 (로컬 변수 테이블 스택 프레임).

  • 참조 된 개체 영역 클래스 정적 속성의 방법.

  • 문자 참조 방법 영역을 객체.

  • 원시 메소드 스택 JNI (원시 메소드) 참조 객체.

사실, 검색 알고리즘의 루트에, 정말 라벨링 과정을 거쳐야 적어도 두 번, 개체의 죽음을 선포 : 객체가 GC 뿌리에 연결되지 않은 참조 체인의 루트에 대한 검색 중 발견되는 경우, 다음 첫 번째 마크가 될 것입니다 및 선별 필터 조건이 필요이 객체가 파이널 라이즈 () 메소드를 수행할지 여부를 수행하는 것이다. 객체가 파이널 라이즈를 포함하지 않는 경우 () 방법, 또는 파이널 라이즈 () 메소드는 가상 머신을 통해 호출 된이 두 사례 불필요하다고 판단되는 가상 머신 수행한다. 객체가 파이널 라이즈 () 메소드를 수행하기 위해 필요한 것으로 판정되면, 오브젝트 F 큐라는 큐에 배치되며, 이후 자동으로 가상 머신에 의해 생성 된 하나에 의해, 낮은 우선 순위의 스레드 파이널 파이널 라이즈 () 메소드를 실행한다. 마무리 () 메소드 (() 메소드가 가장 큰 시스템되면 자동으로 호출되는 객체 마무리로) 객체의 죽음의 운명을 탈출 할 수있는 마지막 기회, 두 번째 소규모의 GC 것 이후 F-대기열 개체입니다 당신이 자신의 마무리 () 메소드를 절약에 성공하려면 마크, 너무 오래 객체 마무리 () 메소드가하는대로 다시 참조 체인에있는 모든 개체를 연결할 수 있습니다. 객체가 체인의 모든 참조에 연결되어 있지 않은 다음 경우에, 그것은 밖으로 복구 할 것입니다.

05 가비지 수집 알고리즘

가비지 객체 후의 판단에 더하여, 그 쓰레기를 재활용 할 수있다. 다음은 가비지 컬렉션 알고리즘의 결과로 가비지 컬렉션 알고리즘의 일부는, 그래서 여기에 주로 각 방법의 아이디어를 명확하게하고, 알고리즘의 특정 구현에 미세하지, 절차 적 세부 사항의 다수 포함됩니다.

1. 마크 - 스윕 알고리즘

마크 - 스윕 알고리즘은 두 단계로 "표시"와 "투명"으로 나누어 져 가장 기본적인 수집 알고리즘이다 : 먼저 원하는 객체가 모든 객체 개는 균일 한 재활용 마크 아웃의 완료 후 회복을 표시 표시, 그건 프로세스는 실제로 루트 검색 알고리즘의 앞에 마킹 쓰레기 오브젝트 것으로 판정한다. 마크 - 청소 알고리즘 구현은 다음과 같습니다 :

의 image.png

이 알고리즘은 다음과 같은 단점이 있습니다 :

  • 표시 및 통관 절차의 효율성은 높지 않다.

  • 프로그램이 충분한 연속 메모리를 찾을 수 없습니다 후속 실행 중에 큰 개체를 할당 할 필요가 다른 가비지 컬렉션 동작을 트리거했을 때, 너무 많이 발생할 수 공간의 파편을 삭제 한 후 개별 메모리 조각화 마크의 큰 숫자를 생성합니다.

2. 알고리즘을 복사

复制算法比较适合于新生代,复制算法是针对标记—清除算法的缺点,在其基础上进行改进而得到的,它讲课用内存按容量分为大小相等的两块,每次只使用其中的一块,当这一块的内存用完了,就将还存活着的对象复制到另外一块内存上面,然后再把已使用过的内存空间一次清理掉。复制算法有如下优点:

  • 每次只对一块内存进行回收,运行高效。

  • 只需移动栈顶指针,按顺序分配内存即可,实现简单。

  • 内存回收时不用考虑内存碎片的出现。

它的缺点是:可一次性分配的最大内存缩小了一半。 复制算法的执行情况如下图所示:

의 image.png

但一般不用按1:1划分内存空间,可以分成一个大的eden和两块小的survivor。

3.标记—整理算法

老年代中,对象存活率比较高,如果执行较多的复制操作,效率将会变低,所以老年代一般会选用其他算法,如标记—整理算法。该算法标记的过程与标记—清除算法中的标记过程一样,但对标记后出的垃圾对象的处理情况有所不同,它不是直接对可回收对象进行清理,而是让所有的对象都向一端移动,然后直接清理掉端边界以外的内存。标记—整理算法的回收情况如下所示:

의 image.png


4.分代收集

当前商业虚拟机的垃圾收集都采用分代收集来管理内存,它根据对象的存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代。在新生代中,每次垃圾收集时都会发现有大量对象死去,只有少量存活,因此可选用复制算法来完成收集,而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记—清除算法或标记—整理算法来进行回收。 每个对象都有一个年龄(Age)计数器,如果对象在Eden出声并讲过一次Minor GC还存活,将被移动到Survivor区并将Age设置为1,之后每在Survivor区中熬过一次Minor GC,Age就加1,当增加到一定程度(默认为15),就可以放到老年代中。

06 垃圾收集器

垃圾收集器是内存回收算法的具体实现,Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同厂商、不同版本的虚拟机所提供的垃圾收集器都可能会有很大的差别。Sun  HotSpot虚拟机1.6版包含了如下收集器:Serial、ParNew、Parallel Scavenge、CMS、Serial Old、Parallel Old。这些收集器以不同的组合形式配合工作来完成不同分代区的垃圾收集工作。

07 垃圾回收分析

在用代码分析之前,我们对内存的分配策略明确以下三点:

  • 对象优先在Eden分配。当Eden没有足够空间分配时,将发起一次Minor GC

  • 大对象(需要大量连续空间的java对象,如长的字符串和数组)直接进入老年代。由于新生代使用复制算法回收内存,这样可以避免在Eden和两个Survivor区之间发生大量的内存复制。

  • 长期存活的对象将进入老年代。

对垃圾回收策略说明以下两点:

  • 新生代GC(Minor GC):发生在新生代的垃圾收集动作,因为Java对象大多都具有朝生夕灭的特性,因此Minor GC非常频繁,一般回收速度也比较快。

  • 老年代GC(Major GC/Full GC):发生在老年代的GC,出现了Major GC,经常会伴随至少一次Minor GC。由于老年代中的对象生命周期比较长,因此Major GC并不频繁,一般都是等待老年代满了后才进行Full GC,而且其速度一般会比Minor GC慢10倍以上。另外,如果分配了Direct Memory,在老年代中进行Full GC时,会顺便清理掉Direct Memory中的废弃对象。

사용하여 달빅 가상 머신 마크 스윕 가비지 컬렉션 알고리즘을. 이름에서 알 수 있듯이, 마크 스윕 가비지 컬렉션 알고리즘은 마크로하고 두 단계를 쓸어. 어떤 마크가 반복적으로 현재의 모든 참조 된 개체를 표시하고, 복구 단계 스윕 개체에 대한 책임이있는 사람들이 참조되지 않은, 처음부터 무대 뿌리 (루트 설정)을 설정합니다. 마크 - 스윕 알고리즘 달빅 가상 머신을 분석하기 전에, 우리는 먼저 상황이 GC를 트리거하는 것이 무엇 아래를보십시오.


추천

출처blog.51cto.com/14453419/2421041