>  기사  >  Java  >  Alibaba 터미널: 하루에 100만 건의 로그인 요청, 8G 메모리, JVM 매개변수를 설정하는 방법은 무엇입니까?

Alibaba 터미널: 하루에 100만 건의 로그인 요청, 8G 메모리, JVM 매개변수를 설정하는 방법은 무엇입니까?

Java后端技术全栈
Java后端技术全栈앞으로
2023-08-15 16:31:231234검색

2년 만에 100개 이상의 이력서를 수정하고 200개 이상의 모의면접을 진행했습니다.


Alibaba 터미널: 하루에 100만 건의 로그인 요청, 8G 메모리, JVM 매개변수를 설정하는 방법은 무엇입니까?

지난주 Alibaba Cloud와의 기술 인터뷰에서 한 반 친구가 다음과 같은 질문을 받았습니다. 하루에 100만 건의 로그인 요청을 처리하는 플랫폼과 8G 메모리를 갖춘 서비스 노드를 가정해 보겠습니다. JVM 매개변수를 설정하시겠습니까? 답변이 이상적이지 않다고 생각하시면 오셔서 리뷰를 요청해주세요.

이력서 수정, 이력서 미화, 이력서 포장, 모의면접 등도 필요하시면 연락주세요.

다음은 면접 질문 형식으로 정리되어 일석이조입니다.

  • 실용 참고용
  • 과 면접 참고용
입니다.

JVM 구성 방식을 제외하고 모두가 배워야 할 또 다른 문제를 분석하는 방법과 문제를 생각하는 관점입니다. 이러한 아이디어와 관점은 모든 사람이 더 멀리 나아가는 데 도움이 될 수 있습니다.

다음으로 본론으로 들어가겠습니다.

일일 로그인 요청이 100만 건이고 메모리가 8G인 JVM 매개변수를 어떻게 설정하나요?

하루 100만 건의 로그인 요청과 8G 메모리에 대한 JVM 매개변수를 설정하는 방법은 대략 다음 8단계로 나눌 수 있습니다.

1단계: 새 시스템이 출시되면 용량을 어떻게 계획하나요?

1. 루틴 요약

모든 새로운 비즈니스 시스템은 온라인으로 전환하기 전에 서버 구성 및 JVM 메모리 매개변수를 추정해야 합니다. 이 용량 및 리소스 계획은 시스템 설계자가 임의로 추정하는 것이 아니라 기반으로 시스템이 위치한 비즈니스 시나리오를 추정하고, 시스템 운영 모델을 추론하며, JVM 성능, GC 빈도 등의 지표를 평가합니다. 다음은 전문가의 경험과 본인의 실습을 바탕으로 요약한 모델링 단계입니다.

  • 비즈니스 시스템에서 생성된 객체가 초당 얼마나 많은 메모리 공간을 차지할지 계산하고, 클러스터 아래 각 시스템의 초당 메모리 공간을 계산합니다(객체 생성 속도).
  • 머신 구성을 설정하고 예상 새로운 세대 공간에서는 다양한 새로운 세대 크기에서 MinorGC가 얼마나 자주 트리거되는지 비교해 보세요.
  • 빈번한 GC를 피하기 위해 필요한 머신 구성 수, 배포된 머신 수, JVM에 할당되는 메모리 공간, 새로운 세대에 할당되는 공간을 재평가할 수 있습니다.
  • 이 구성 세트를 기반으로 우리는 기본적으로 전체 시스템의 운영 모델, 초당 생성되는 개체 수, 1초 후에 가비지가 될 개체 수, 시스템 실행 시간 및 새 개체의 빈도를 계산할 수 있습니다. 생성은 GC를 트리거합니다.

2. 실제 루틴 - 시스템 로그인을 예로 들어보세요.

일부 학생들은 이 단계를 보고도 여전히 놀랐고, 실제 프로젝트에 관해 이야기하는 것 같았습니다. 어떻게 해야할지 모르겠어요!

연습하지 않고 그냥 이야기하세요. 로그인 시스템을 예로 들어 추론 과정을 시뮬레이션하세요.

  • 하루에 100만 건의 로그인 요청이 있다고 가정하고, 로그인 요청이 가장 많은 시간은 오전 시간 동안 초당 100건의 로그인 요청이 있을 것으로 추정됩니다.
  • 3개의 서버가 배포되고 각 시스템이 초당 30개의 로그인 요청을 처리한다고 가정합니다. 차세대 JVM은 초당 30개의 로그인 개체를 생성합니다. 1초 후에 완료됩니다. 객체는 쓰레기가 됩니다.
  • 로그인 요청 개체에 20개의 필드가 있다고 가정하면 하나의 개체는 500바이트로 추정되며, 30개의 로그인이 약 15kb를 차지합니다. RPC 및 DB 작업, 네트워크 통신, 쓰기 라이브러리 및 쓰기 캐시를 고려하면 가능합니다. 20~50배로 확장해 약 1초 안에 수백 개의 k-1M 데이터를 생성한다.
  • 2C4G 머신이 배포되고 2G 힙 메모리가 할당된다고 가정하면 새로운 세대는 수백 M에 불과합니다. 1s1M의 가비지 생성 속도에 따르면 MinorGC는 몇 백 초에 한 번 트리거됩니다.
  • 4C8G 머신이 배포되고, 4G 힙 메모리가 할당되고, 2G가 새로운 세대에 할당된다고 가정하면 MinorGC를 트리거하는 데 몇 시간이 걸립니다.

그러므로 4C8G의 3-인스턴스 클러스터 구성에 따라 하루 100만 건의 요청을 처리하는 로그인 시스템은 4G 힙 메모리와 2G 차세대 JVM을 할당하면 시스템의 정상적인 로드를 보장할 수 있다고 대략적으로 유추할 수 있습니다. .

기본적으로 새 시스템의 리소스를 평가하므로 새 시스템을 구축하는 데 각 인스턴스에 필요한 용량과 구성이 얼마나 되는지, 클러스터에 인스턴스가 몇 개 구성되어 있는지 등은 머리와 가슴을 두드려서 결정할 수 없습니다.

2단계: 가비지 수집기를 선택하는 방법은 무엇입니까?

처리량 또는 응답 시간

먼저 처리량과 낮은 대기 시간이라는 두 가지 개념을 소개합니다

처리량 = 사용자 응용 프로그램을 실행하는 CPU 시간 / (사용자 응용 프로그램을 실행하는 CPU 시간 + CPU 가비지 수집 시간)

응답 시간 = 평균 GC 시간 소모

보통 처리량이 우선이거나 응답이 우선시되는 것이 JVM의 딜레마입니다.

힙 메모리가 증가하면 gc가 한 번에 처리할 수 있는 양이 늘어나고 처리량이 높아집니다. 그러나 하나의 gc에 소요되는 시간이 길어지고 결과적으로 뒤에 대기하는 스레드가 길어집니다. 반대로 힙 메모리가 작으면 하나의 gc에 걸리는 시간도 짧아지고 큐에 대기 중인 스레드의 대기 시간도 짧아지고 지연도 줄어들지만 한 번에 요청하는 개수는 작아진다(완전히 일관되지는 않음).

처리량이나 응답을 동시에 우선시하는 것은 불가능합니다.

가비지 수집기 설계 시 고려 사항

  • JVM은 GC 중에 가비지 수집과 새 객체 생성을 허용하지 않습니다(쓰레기를 청소하는 동시에 버릴 수 없는 것처럼).
  • JVM에는 Stop the world 일시 중지 시간이 필요하며 STW로 인해 시스템이 잠시 일시 중지되고 요청을 처리할 수 없게 됩니다.
  • 신세대는 높은 수집 빈도, 성능 우선 순위 및 일반적으로 사용되는 복제 알고리즘을 갖습니다. ; 이전 세대는 빈도가 낮고 공간에 민감하므로 복사 방법을 피하십시오.
  • 모든 가비지 수집기의 목표는 GC의 빈도를 줄이고, 더 짧게 만들고, GC가 시스템에 미치는 영향을 줄이는 것입니다!

CMS 및 G1

현재 주류 가비지 컬렉터 구성은 신세대에서는 ParNew를 사용하고 구세대에서는 CMS를 조합하거나 G1 컬렉터를 완전히 사용하는 것입니다.

향후 트렌드 관점에서 볼 때 G1은 공식 유지 관리되고 더욱 존경받는 가비지 수집기입니다.

Alibaba 터미널: 하루에 100만 건의 로그인 요청, 8G 메모리, JVM 매개변수를 설정하는 방법은 무엇입니까?

비즈니스 시스템:

  • 지연 시간에 민감한 서비스에 권장되는 CMS
  • 높은 처리량이 필요한 대용량 메모리 서비스의 경우 G1 리사이클러를 사용하세요!

CMS 가비지 수집기 작동 메커니즘

CMS는 주로 이전 세대를 위한 수집기입니다. 이전 세대는 기본적으로 FullGC 알고리즘 후에 조각 모음 알고리즘을 수행하여 메모리 조각을 정리합니다.

ㅋㅋㅋ
예 SoonSlow
2. 동시 마킹 동시 마킹 단계는 GCRoots Tracing No
3 리마킹 단계는 동시 작업 중 사용자 프로그램 오류를 수정하는 단계입니다. 마킹(marking) 계속 작동하여 마크 변경을 일으키는 물체의 해당 부분에 대한 마크 기록입니다. 빠름
4. 가비지 수집 가비 개체 동시 청소(표시 및 청소 알고리즘) 아니요 느림
  • 장점: 동시 수집, "낮은 대기 시간"에 중점을 둡니다. 가장 시간이 많이 소요되는 두 단계에서는 STW가 발생하지 않았으며 STW가 필요한 단계는 매우 빠르게 완료되었습니다.
  • 단점: 1. CPU 소비 2. 떠다니는 쓰레기 3. 메모리 조각화
  • 적용 가능한 시나리오: 서버 응답 속도에 주의하고 가장 짧은 시스템 일시 중지 시간이 필요합니다.

간단히 말하면

CM은 지연 시간에 민감한 비즈니스 시스템에 권장됩니다.

높은 처리량이 필요한 대용량 메모리 서비스의 경우 G1 리사이클러를 사용하세요!

3단계: 각 파티션의 비율과 크기를 계획하는 방법

일반적인 아이디어는 다음과 같습니다.

먼저 JVM의 가장 중요하고 핵심 매개변수는 메모리와 할당을 평가하는 것입니다. 힙 메모리 크기를 지정하는 것입니다. 이는 시스템이 온라인 상태가 될 때 수행되어야 하며, -Xms 초기 힙 크기, -Xmx 최대 힙 크기, 백그라운드 Java 서비스는 일반적으로 시스템 메모리의 절반으로 지정됩니다. 서버의 시스템 리소스를 차지하게 되며, 리소스가 너무 작으면 JVM을 최상의 성능으로 사용할 수 없습니다.

두 번째로, 새로운 세대의 -Xmn 크기를 지정해야 합니다. 이 매개변수는 매우 중요하고 매우 유연합니다. Sun은 공식적으로 3/8 크기를 권장하지만 상태 비저장의 경우 비즈니스 시나리오에 따라 결정해야 합니다. 또는 경량 상태 서비스(현재 가장 일반적인 비즈니스 시스템(예: 웹 애플리케이션)의 경우 신세대에는 일반적으로 힙 메모리 크기의 3/4이 제공될 수 있습니다. 상태 저장 서비스(IM 서비스, 게이트웨이 액세스와 같은 일반 시스템)의 경우 레이어 등) 새로운 세대에는 기본값을 부여할 수 있습니다. 비율을 1/3로 설정하세요. 서비스는 상태 저장형입니다. 즉, 더 많은 로컬 캐시와 세션 상태 정보가 메모리에 상주하므로 이러한 개체를 저장하려면 이전 세대에 더 많은 공간을 설정해야 합니다.

마지막으로 -Xss 스택 메모리 크기를 설정하고 단일 스레드의 스택 크기를 설정합니다. 기본값은 JDK 버전 및 시스템에 관련되며 일반적으로 기본값은 512~1024kb입니다. 백그라운드 서비스에 수백 개의 상주 스레드가 있는 경우 스택 메모리도 수백 M 크기를 차지합니다.

JVM 매개변수 설명 Default Recommended
-Xms Java 힙 메모리 크기 OS 메모리 64/1 OS 메모리 반
-Xmx Java 힙 메모리의 최대 크기 OS 메모리 4/1 OS 메모리의 절반
-Xmn Java 힙 메모리에서 새로운 세대의 크기를 빼고 남은 메모리 크기는 구세대의 메모리 크기 할인금액의 1/3 sun은 3/8을 권장합니다
-Xss 각 스레드의 스택 메모리 크기 는 idk sun
과 관련이 있습니다.

8G 메모리의 경우 일반적으로 최대 메모리의 절반을 할당하면 충분합니다. 왜냐하면 기계가 여전히 일정량의 메모리를 차지하기 때문에 일반적으로 4G 메모리가 JVM에 할당됩니다.

학생들을 테스트하는 성능 스트레스 테스트 링크를 소개합니다. 로그인 인터페이스를 1초로 누르세요. 객체 생성 속도는 ParNew+CMS 결합 리사이클러를 사용하여 60M입니다.

일반적인 JVM 매개변수 구성은 다음과 같습니다.

-Xms3072M -Xmx3072M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M -XX:SurvivorRatio=8

이러한 설정은 동적 문제로 인해 전체 gc가 자주 발생할 수 있습니다. 대상 연령 판단 원칙. 왜?

스트레스 테스트 중에는 짧은 시간(예: 20초 후)에 Eden 영역이 가득 차게 됩니다. 이때 다시 실행하면 개체를 할당할 수 없으며 MinorGC가 트리거됩니다. S1은 이 GC 후에 100M을 로드하고 즉시 통과합니다. 20S에서 다시 트리거됩니다. S1 영역에 있는 추가 100M 생존 객체 + 100M은 현재 S2 영역에 성공적으로 들어갈 수 없습니다. JVM의 age 메커니즘이 트리거되고 약 100M의 객체 배치가 저장을 위해 이전 세대로 푸시됩니다. 일정 기간 동안 계속 실행되면 시스템은 한 시간 내에 FullGC를 트리거할 수 있습니다.

8:1:1의 기본 비율에 따라 할당하면 생존 영역은 1G의 약 10%, 즉 수십에서 100M에 불과합니다.

如果  每次minor GC垃圾回收过后进入survivor对象很多,并且survivor对象大小很快超过 Survivor 的 50% ,  那么会触发动态年龄判定规则,让部分对象进入老年代.

而一个GC过程中,可能部分WEB请求未处理完毕,  几十兆对象,进入survivor的概率,是非常大的,甚至是一定会发生的.

如何解决这个问题呢?为了让对象尽可能的在新生代的eden区和survivor区, 尽可能的让survivor区内存多一点,达到200兆左右,

于是我们可以更新下JVM参数设置:

-Xms3072M -Xmx3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M  -XX:SurvivorRatio=8  

说明:
‐Xmn2048M ‐XX:SurvivorRatio=8 
年轻代大小2g,eden与survivor的比例为8:1:1,也就是1.6g:0.2g:0.2g
Alibaba 터미널: 하루에 100만 건의 로그인 요청, 8G 메모리, JVM 매개변수를 설정하는 방법은 무엇입니까?

survivor达到200m,如果几十兆对象到底survivor, survivor 也不一定超过 50%

这样可以防止每次垃圾回收过后,survivor对象太早超过 50% ,

这样就降低了因为对象动态年龄判断原则导致的对象频繁进入老年代的问题,

JVM 동적 연령 결정 규칙은 무엇입니까?

Old Generation에 진입하는 객체에 대한 동적 연령 판단 규칙(동적 승격 연령 계산 임계값): Minor GC 동안 생존자에서 1~N까지의 객체 크기가 생존자의 50%를 초과하는 경우, 그보다 크거나 N 나이와 동일하게 배치됩니다. 노년기에 들어서게 됩니다.

핵심 최적화 전략은 생존자에 단기 생존 객체를 최대한 유지하고 Old Generation에 들어가지 않는 것입니다. 이런 식으로 이러한 객체는 Minor GC 중에 재활용되어 Old Generation에 들어가지 않게 됩니다. 전체 gc.

신세대 메모리를 평가하고 적절하게 할당하는 방법은 무엇입니까?

여기서 특별히 언급하는 것은 JVM의 가장 중요하고 핵심적인 매개변수는 메모리와 할당을 평가하는 것입니다.

첫 번째 단계는 힙 메모리의 크기를 지정하는 것입니다. 이는 시스템이 온라인 상태가 될 때 수행해야 하는 작업입니다. 초기 힙 크기, -Xmx 최대 힙 크기는 일반적으로 백그라운드 Java 서비스의 시스템 메모리의 절반으로 지정됩니다. 너무 크면 서버의 시스템 리소스를 차지하게 되며, 너무 작으면 최상의 성능을 발휘합니다. JVM을 실행할 수 없습니다.

두 번째로, 새로운 세대의 -Xmn 크기를 지정해야 합니다. 이 매개변수는 매우 중요하며 유연성이 뛰어납니다. Sun에서는 공식적으로 3/8 크기를 권장하지만 비즈니스 시나리오에 따라 결정해야 합니다.

  • 상태 비저장 또는 경량 상태 서비스(현재 웹 애플리케이션과 같은 가장 일반적인 비즈니스 시스템)의 경우 일반적으로 새로운 세대에 힙 메모리 크기의 3/4이 제공될 수도 있습니다.
  • 상태 저장 서비스의 경우(공통 시스템; IM 서비스, 게이트웨이 액세스 계층 등) 새로운 세대는 1/3의 기본 비율에 따라 설정될 수 있습니다.

서비스는 상태 저장형입니다. 즉, 더 많은 로컬 캐시와 세션 상태 정보가 메모리에 상주하게 되며, 이는 구세대가 이러한 개체를 저장할 수 있도록 더 많은 공간을 설정해야 함을 의미합니다.

step4: 적절한 스택 메모리 크기는 얼마입니까?

-Xss 스택 메모리 크기, 단일 스레드의 스택 크기를 설정합니다. 기본값은 JDK 버전 및 시스템과 관련되며 일반적으로 기본값은 512~1024kb입니다. 백그라운드 서비스에 수백 개의 상주 스레드가 있는 경우 스택 메모리도 수백 M 크기를 차지합니다.

step5: Old Generation으로 옮기는 것이 적절하기 전의 개체의 나이는 몇 살입니까?

마이너 GC가 20~30초가 걸리고 대부분의 객체는 일반적으로 몇 초 안에 쓰레기가 된다고 가정하면,

그 객체가 오랫동안 재활용되지 않은 경우, 예를 들어 2년 동안 재활용되지 않은 것입니다. 이러한 객체들은 오랫동안 생존하여 생존 영역 공간을 계속 점유하지 않고 Old Generation으로 이동되는 객체라고 볼 수 있다.

所以,可以将默认的15岁改小一点,比如改为5,

那么意味着对象要经过5次minor gc才会进入老年代,整个时间也有一两分钟了(5*30s= 150s),和几秒的时间相比,对象已经存活了足够长时间了。

所以:可以适当调整JVM参数如下:

‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8 ‐XX:MaxTenuringThreshold=5

step6:多大的对象,可以直接到老年代比较合适?

对于多大的对象直接进入老年代(参数-XX:PretenureSizeThreshold),一般可以结合自己系统看下有没有什么大对象 生成,预估下大对象的大小,一般来说设置为1M就差不多了,很少有超过1M的大对象,

所以:可以适当调整JVM参数如下:

‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8 ‐XX:MaxTenuringThreshold=5 ‐XX:PretenureSizeThreshold=1M

step7:垃圾回收器CMS老年代的参数优化

JDK8默认的垃圾回收器是-XX:+UseParallelGC(年轻代)和-XX:+UseParallelOldGC(老年代),

如果内存较大(超过4个G,只是经验 值),还是建议使用G1.

这里是4G以内,又是主打“低延时” 的业务系统,可以使用下面的组合:

ParNew+CMS(-XX:+UseParNewGC -XX:+UseConcMarkSweepGC)

新生代的采用ParNew回收器,工作流程就是经典复制算法,在三块区中进行流转回收,只不过采用多线程并行的方式加快了MinorGC速度。

老生代的采用CMS。再去优化老年代参数:比如老年代默认在标记清除以后会做整理,还可以在CMS的增加GC频次还是增加GC时长上做些取舍,

如下是响应优先的参数调优:

XX:CMSInitiatingOccupancyFraction=70

设定CMS在对内存占用率达到70%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC)

XX:+UseCMSInitiatinpOccupancyOnly

和上面搭配使用,否则只生效一次

-XX:+AlwaysPreTouch

强制操作系统把内存真正分配给IVM,而不是用时才分配。

综上,只要年轻代参数设置合理,老年代CMS的参数设置基本都可以用默认值,如下所示:

‐Xms3072M ‐Xmx3072M ‐Xmn2048M ‐Xss1M ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐XX:SurvivorRatio=8  ‐XX:MaxTenuringThreshold=5 ‐XX:PretenureSizeThreshold=1M ‐XX:+UseParNewGC ‐XX:+UseConcMarkSweepGC ‐XX:CMSInitiatingOccupancyFraction=70 ‐XX:+UseCMSInitiatingOccupancyOnly ‐XX:+AlwaysPreTouch

参数解释

1.‐Xms3072M ‐Xmx3072M 最小最大堆设置为3g,最大最小设置为一致防止内存抖动

2.‐Xss1M 线程栈1m

3.‐Xmn2048M ‐XX:SurvivorRatio=8 年轻代大小2g,eden与survivor的比例为8:1:1,也就是1.6g:0.2g:0.2g

4.-XX:MaxTenuringThreshold=5 年龄为5进入老年代 5.‐XX:PretenureSizeThreshold=1M 大于1m的大对象直接在老年代生成

6.‐XX:+UseParNewGC ‐ XX:+UseConcMarkSweepGC 使useParNew+cms垃圾回收器组合‐XX:+UseParNewGC ‐XX:+UseConcMarkSweepGC 使用ParNew+cms垃圾回收器组合

7.‐XX:CMSInitiatingOccupancyFraction=70 老年代中对象达到这个比例后触发fullgc

8.‐XX:+UseCMSInitiatinpOccupancyOnly  老年代中对象达到这个比例后触发fullgc,每次

9.‐XX:+AlwaysPreTouch

7.‐XX:CMSInitiatingOccupancyFraction=70 老年代中对象达到这个比例后触发fullgc

8.‐XX:+UseCMSIinitiatinpOccupancyOnly  老年代中对象达到这个比例后触发fullgc,每次

9.‐XX:+AlwaysPreTouch 코드> 强제조작작系统把内存真正分配给IVM,而不是用时才分配。<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'></p>🎜step8:配置OOM时候的内存dump文件和GC日志🎜🎜🎜额외增加了GC日志打印、OOM自动dump等配置内容,帮助进行问题排查🎜<pre class="brush:php;toolbar:false;">-XX:+HeapDumpOnOutOfMemoryError</pre><p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>在Out Of Memory,JVM快死掉的时候,输出Heap Dump到指定文件。</p> <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>不然开发很多时候还真不知道怎么重现错误。</p> <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>路径只指向目录,JVM会保持文件名的唯一性,叫java_pid${pid}.hprof。</p><pre class="brush:php;toolbar:false;">-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${LOGDIR}/</pre><p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>因为如果指向特定的文件,而文件已存在,反而不能写入。</p> <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>输出4G的HeapDump,会导致IO性能问题,在普通硬盘上,会造成20秒以上的硬盘IO跑满,</p> <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>需要注意一下,但在容器环境下,这个也会影响同一宿主机上的其他容器。</p> <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>GC的日志的输出也很重要:</p><pre class="brush:php;toolbar:false;">-Xloggc:/dev/xxx/gc.log -XX:+PrintGCDateStamps -XX:+PrintGCDetails</pre><p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>GC的日志实际上对系统性能影响不大,打日志对排查GC问题很重要。</p> <h4 data-tool="mdnice编辑器" style='margin-top: 30px;margin-bottom: 15px;outline: 0px;font-weight: bold;font-size: 18px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);color: black;'>一份通用的JVM参数模板</h4> <blockquote data-tool="mdnice编辑器" style='margin-top: 0px;margin-bottom: 20px;padding: 8px 10px 8px 15px;outline: 0px;border-left-width: 2px;border-left-color: rgb(239, 112, 96);color: rgb(106, 115, 125);font-size: 0.9em;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;text-align: left;white-space: normal;word-spacing: 0.8px;border-top: none;border-right: none;border-bottom: none;overflow: auto;background: rgb(255, 249, 249);letter-spacing: 0.5444px;'> <p style="margin-right: 10px;margin-left: 10px;padding-top: 8px;padding-bottom: 8px;outline: 0px;line-height: 26px;color: rgb(53, 53, 53);font-size: 16px;">一般来说,大企业或者架构师团队,都会为项目的业务系统定制一份较为通用的JVM参数模板,但是许多小企业和团队可能就疏于这一块的设计,如果老板某一天突然让你负责定制一个新系统的JVM参数,你上网去搜大量的JVM调优文章或博客,结果发现都是零零散散的、不成体系的JVM参数讲解,根本下不了手,这个时候你就需要一份较为通用的JVM参数模板了,不能保证性能最佳,但是至少能让JVM这一层是稳定可控的,</p> <p style="margin-right: 10px;margin-left: 10px;padding-top: 8px;padding-bottom: 8px;outline: 0px;line-height: 26px;color: rgb(53, 53, 53);font-size: 16px;">在这里给大家总结了一份模板:</p> </blockquote> <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'><span style="outline: 0px;font-weight: 700;color: rgb(248, 57, 41);">基于4C8G系统的ParNew+CMS回收器模板(响应优先),新生代大小根据业务灵活调整!</span></p><pre class="brush:php;toolbar:false;">-Xms4g -Xmx4g -Xmn2g -Xss1m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=10 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:gc.log</pre><h4 data-tool="mdnice编辑器" style='margin-top: 30px;margin-bottom: 15px;outline: 0px;font-weight: bold;font-size: 18px;font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);color: black;'>如果是GC的吞吐优先,推荐使用G1,基于8C16G系统的G1回收器模板:</h4> <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>G1收集器自身已经有一套预测和调整机制了,因此我们首先的选择是相信它,</p> <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>即调整-<code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>XX:MaxGCPauseMillis=N参数,这也符合G1的目的——让GC调优尽量简单!

同时也不要自己显式设置新生代的大小(用-Xmn或-XX:NewRatio参数),

如果人为干预新生代的大小,会导致目标时间这个参数失效。

-Xms8g
-Xmx8g
-Xss1m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=150
-XX:InitiatingHeapOccupancyPercent=40
-XX:+HeapDumpOnOutOfMemoryError
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-Xloggc:gc.log
G1参数 描述 默认值
XX:MaxGCPauseMillis=N 最大GC停顿时间。柔性目标,JVM满足90%,不保证100%。 200
-XX:nitiatingHeapOccupancyPercent=n 当整个堆的空间使用百分比超过这个值时,就会融发MixGC 45

-XX:MaxGCPauseMillis code>의 경우 매개변수 설정에는 분명한 경향이 있습니다. 낮음 ↓: 지연이 낮지만 MinorGC가 빈번하고 MixGC가 이전 영역을 덜 재활용하여 Full GC의 위험이 증가합니다. ↑ 증가: 한 번에 더 많은 객체가 재활용되지만 전체 시스템 응답 시간도 길어집니다. <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>-XX:MaxGCPauseMillis来说,参数的设置带有明显的倾向性:调低↓:延迟更低,但MinorGC频繁,MixGC回收老年代区减少,增大Full GC的风险。调高↑:单次回收更多的对象,但系统整体响应时间也会被拉长。

针对InitiatingHeapOccupancyPercent

InitiatingHeapOccupancyPercent In 즉, 매개변수 크기 조정 효과도 다릅니다. ↓ 낮추기: MixGC를 더 일찍 트리거하여 CPU를 낭비합니다. ↑ 증가: 여러 세대의 재활용 지역이 축적되어 FullGC 위험이 증가합니다.

튜닝 요약

시스템이 온라인 상태가 되기 전의 포괄적인 튜닝 아이디어:

1. 비즈니스 추정: 예상되는 동시성과 각 작업의 평균 메모리 요구 사항을 기반으로 이를 호스팅하는 데 필요한 시스템 수를 평가합니다. 각 머신에 필요한 구성은 무엇입니까?

2. 용량 추정: 시스템의 작업 처리 속도에 따라 Eden 및 Surivior 영역의 크기와 Old Generation의 메모리 크기를 합리적으로 할당합니다.

3. 리사이클러 선택: 응답 우선 순위가 있는 시스템의 경우 ParNew+CMS 리사이클러를 사용하는 것이 좋습니다. 처리량 우선, 멀티 코어 대용량 메모리(힙 크기 ≥ 8G) 서비스의 경우 G1 리사이클러를 사용하는 것이 좋습니다. . 🎜

4. 최적화 아이디어: MinorGC 단계에서 수명이 짧은 개체를 재활용합니다(동시에 생존자 영역의

5. 지금까지 요약한 튜닝 과정은 주로 온라인 진출 전 테스트 및 검증 단계를 기반으로 하므로, 온라인 진출 전 머신의 JVM 매개변수를 최적의 값으로 설정하려고 노력합니다!

JVM 튜닝은 단지 수단일 뿐이지만 JVM 튜닝으로 모든 문제를 해결할 수는 없습니다. 대부분의 Java 애플리케이션에는 JVM 최적화가 필요하지 않습니다.

  • 온라인에 접속하기 전에 먼저 고려해야 할 사항 머신의 JVM 매개변수를 최적으로 설정합니다.
  • 생성된 개체 수를 줄입니다(코드 수준).
  • 전역 변수 및 대형 개체의 사용을 줄입니다(코드 수준). 조정 최적화 및 코드 튜닝, JVM 최적화는 최후의 수단입니다(코드 및 아키텍처 수준).
  • JVM 매개변수(코드 수준)를 최적화하는 것보다 GC 상황을 분석하고 코드를 최적화하는 것이 더 좋습니다. 위의 원칙을 통해 우리는 실제로 가장 효과적인 최적화 방법은 아키텍처와 코드 수준의 최적화인 반면 JVM 최적화는 서버 구성의 마지막 "압박"이라고도 할 수 있는 최후의 수단이라는 것을 발견했습니다. .

    ZGC란 무엇인가요?

    ZGC(Z Garbage Collector)는 낮은 대기 시간을 주요 목표로 하여 Oracle에서 개발한 가비지 수집기입니다.

    에이징 생성 없이 (일시적으로) 동적 영역 메모리 레이아웃을 기반으로 하는 수집기이며 읽기 장벽, 염색 포인터 및 메모리 다중 매핑과 같은 기술을 사용하여 동시 마크 정렬 알고리즘을 구현합니다.

    JDK 11에 새로 추가되었으며 아직 실험 단계입니다.

    주요 기능은 테라바이트 단위의 메모리를 재활용하고(최대 4T) 일시 중지 시간이 10ms를 초과하지 않습니다.

    장점: 낮은 일시 중지, 높은 처리량, ZGC 수집 중 추가 메모리 소비가 거의 없음

    단점: 떠다니는 쓰레기

    현재 거의 사용되지 않으며, 진정으로 인기를 얻으려면 여전히 작성 시간이 걸립니다.

    가비지 수집기를 선택하는 방법은 무엇입니까?

    실제 시나리오에서 선택하는 방법은 다음과 같습니다. 다음은 도움이 되기를 바랍니다.

    1. 힙 크기가 그다지 크지 않은 경우(예: 100MB) 일반적으로 직렬 수집기를 선택하는 것이 좋습니다. 가장 효율적입니다. 매개변수: -XX:+직렬 GC 사용 코드>. <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>-XX:+UseSerialGC 。

    2、如果你的应用运行在单核的机器上,或者你的虚拟机核数只有 单核,选择串行收集器依然是合适的,这时候启用一些并行收集器没有任何收益。参数:-XX:+UseSerialGC 。

    3、如果你的应用是“吞吐量”优先的,并且对较长时间的停顿没有什么特别的要求。选择并行收集器是比较好的。参数:-XX:+UseParallelGC

    2. 애플리케이션이 단일 코어 시스템에서 실행되거나 가상 시스템에 단일 코어만 있는 경우에도 직렬 수집기를 선택하는 것이 적절합니다. 이때 일부 병렬 수집기를 활성화해도 이점이 없습니다. 매개변수: -XX:+직렬 GC 사용 코드>. 🎜🎜3. 애플리케이션이 "처리량"을 우선시하고 긴 일시 중지에 대한 특별한 요구 사항이 없는 경우. 병렬 수집기를 선택하는 것이 좋습니다. 매개변수: <code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px; background-color: rgba(27, 31, 35, 0.05);글꼴군: " operator mono consolas monaco menlo monospace break-all rgb>-XX:+UseParallelGC 코드>. 🎜<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'>4. 애플리케이션의 응답 시간 요구 사항이 높고 일시 중지 횟수를 줄이려는 경우. 1초만 멈춰도 요청 실패 횟수가 많아 G1, ZGC, CMS를 선택하는 것이 합리적이다. 이러한 수집기의 GC 일시 중지는 일반적으로 더 짧지만 작업을 처리하려면 추가 리소스가 필요하며 일반적으로 처리량이 더 낮습니다. 매개변수: <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>-XX:+UseConcMarkSweepGC 、 -XX:+UseG1GC 、 -XX:+UseZGC 등 위의 출발점에서 일반 웹 서버는 응답성에 대한 요구 사항이 매우 높습니다.

    실제로 선택성은 CMS, G1 및 ZGC에 집중되어 있습니다. 일부 예약된 작업의 경우 병렬 수집기를 사용하는 것이 더 나은 선택입니다.

    핫스팟이 영구 생성을 대체하기 위해 메타공간을 사용하는 이유는 무엇인가요?

    메타공간이란 무엇인가요? 영구세대란 무엇인가? 영구 생성 대신 메타공간을 사용하는 이유는 무엇입니까?

    먼저 메서드 영역을 검토하고 가상 머신이 실행 중일 때의 데이터 메모리 다이어그램을 살펴보면 다음과 같습니다.

    Alibaba 터미널: 하루에 100만 건의 로그인 요청, 8G 메모리, JVM 매개변수를 설정하는 방법은 무엇입니까?

    메서드 영역은 힙과 마찬가지로 각 스레드가 공유하는 메모리 영역으로, 클래스 정보, 상수, 정적 변수, JIT(Just-In-Time) 컴파일 코드 등의 데이터를 저장하는 데 사용됩니다. 가상 머신.

    영구세대란? 메소드 영역과 어떤 관련이 있나요?

    HotSpot 가상 머신에서 개발하고 배포하는 경우 많은 프로그래머는 메소드 영역을 영구 세대라고 부릅니다.

    메서드 영역은 사양이고, 영구 생성은 Hotspot의 사양 구현이라고 할 수 있습니다.

    Java7 및 이전 버전에서는 메소드 영역이 영구 생성으로 구현되었습니다.

    메타공간이란 무엇인가요? 메소드 영역과 어떤 관련이 있나요?

    Java8의 경우 HotSpots는 영구 생성을 취소하고 메타공간으로 대체했습니다.

    즉, 메소드 영역은 여전히 ​​존재하지만 구현 방식이 영구 생성에서 메타공간으로 변경되었습니다.

    영구세대가 메타스페이스로 대체되는 이유는 무엇인가요?

    영구 세대의 메소드 영역은 힙이 사용하는 물리적 메모리와 연속되어 있습니다.

    Alibaba 터미널: 하루에 100만 건의 로그인 요청, 8G 메모리, JVM 매개변수를 설정하는 방법은 무엇입니까?

    영구세대는 다음 두 가지 매개변수를 통해 구성됩니다~

    • -XX:PremSize code>: 영구 생성의 초기 크기를 설정합니다<code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>-XX:PremSize:设置永久代的初始大小
    • -XX:MaxPermSize
    -XX:MaxPermSize: 영구 생성의 최대값을 설정합니다. 기본값은 64M

    영구 세대

    의 경우 많은 클래스가 동적으로 생성되는 경우

    java.lang .OutOfMemoryError가 발생할 가능성이 높습니다. PermGen 공간 오류

    , 영구 생성 공간 구성이 제한되어 있기 때문입니다. 가장 일반적인 시나리오는 웹 개발에 jsp 페이지가 많은 경우입니다.

    JDK8 이후에는 메소드 영역이 메타스페이스에 존재합니다.

    물리적 메모리는 더 이상 힙과 연속되지 않고 로컬 메모리에 직접 존재합니다. 이론적으로 머신
    메모리의 크기는 메타공간Alibaba 터미널: 하루에 100만 건의 로그인 요청, 8G 메모리, JVM 매개변수를 설정하는 방법은 무엇입니까?의 크기입니다.

    🎜🎜다음 매개변수를 통해 메타공간의 크기를 설정할 수 있습니다.🎜
    • -XX:MetaspaceSize code>, 이 값에 도달하면 유형 언로드를 위해 가비지 수집이 트리거됩니다. 동시에 GC는 값을 조정합니다. 많은 양의 공간이 해제되면 값이 적절하게 줄어듭니다. ; 소량의 공간이 해제되면 MaxMetaspaceSize를 초과하지 않는 경우 이 값을 적절하게 늘리십시오. <code style='margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 93, 108);'>-XX:MetaspaceSize,初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
    • -XX:MaxMetaspaceSize,最大空间,默认是没有限制的。
    • -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
    • -XX:MaxMetaspaceFreeRatio
    -XX:MaxMetaspaceSize의 최대 공간은 기본적으로 무제한입니다. <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'></p> <p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'></p> <code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px;outline: 0px;font-size: 14px;border-radius: 4px; background-color: rgba(27, 31, 35, 0.05);글꼴 계열: " operator mono consolas monaco menlo monospace break-all rgb>-XX:MinMetaspaceFreeRatio, GC 이후 메타스페이스 남은 공간 용량의 최소 비율은 할당된 공간<p data-tool="mdnice编辑器" style='margin-top: 0.8em;margin-bottom: 0.8em;padding-top: 8px;padding-bottom: 8px;outline: 0px;color: rgb(53, 53, 53);font-family: Optima-Regular, Optima, PingFangSC-light, PingFangTC-light, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;font-size: 16px;letter-spacing: 0.8px;text-align: left;white-space: normal;word-spacing: 0.8px;background-color: rgb(255, 255, 255);line-height: 1.75;'></p>🎜🎜<code style="margin-right: 2px;margin-left: 2px;padding: 2px 4px)으로 인한 가비지 컬렉션으로 줄어듭니다. ;개요: 0px;글꼴 크기: 14px;경계 반경: 4px;배경 색상: rgba(27, 31, 35, 0.05);글꼴 계열: " operator mono consolas monaco menlo break-all rgb>-XX:MaxMetaspaceFreeRatio, GC 후 최대 메타스페이스 남은 공간 용량의 백분율이 여유 공간으로 인한 양으로 줄어듭니다. Garbage Collection🎜🎜🎜🎜그렇다면 왜 영구 생성을 대체하기 위해 메타스페이스를 사용할까요? 🎜🎜표면적으로는 OOM 예외를 피하기 위한 것입니다. 🎜🎜PermSize와 MaxPermSize는 일반적으로 영구 생성의 크기를 설정하는 데 사용되므로 영구 생성의 상한이 결정되지만 기본값을 사용하면 얼마나 크게 설정해야 하는지 항상 알 수는 없습니다. , OOM 오류가 발생하기 쉽습니다. 🎜

    메타공간을 사용할 때 로드할 수 있는 메타데이터 클래스 수는 더 이상 MaxPermSize에 의해 제어되지 않고 시스템의 실제 사용 가능한 공간에 따라 제어됩니다.

    Stop The World가 무엇인가요? 안전한 장소란 무엇입니까?

    가비지 수집 과정에는 개체 이동이 포함됩니다.

    객체 참조 업데이트의 정확성을 보장하려면 모든 사용자 스레드를 일시 중지해야 합니다. 가상 머신 디자이너는 이와 같은 일시 중지를 Stop The World로 설명합니다. STW라고도 합니다.

    HotSpot에는 OopMap이라는 데이터 구조(매핑 테이블)가 있습니다.

    클래스 로딩 작업이 완료되면 HotSpot은 객체의 어떤 오프셋에 어떤 유형의 데이터가 있는지 계산하여 OopMap에 기록합니다.

    적시 컴파일 프로세스 중에 OopMap도 특정 위치에서 생성되어 스택 및 레지스터의 어느 위치가 참조인지 기록합니다.

    이러한 특정 위치는 주로 다음 위치에 있습니다. 1. 루프의 끝(계산되지 않은 루프)

    2. 메서드가 반환되기 전/메서드의 호출 명령을 호출한 후

    3. 예외가 발생할 수 있는 위치

    이러한 위치를 safepoints라고 합니다.

    사용자 프로그램이 실행되면 코드 명령 흐름의 어느 위치에서나 가비지 수집을 일시 중지하고 시작할 수 없지만 일시 중지되기 전에 안전한 지점까지 실행해야 합니다.

위 내용은 Alibaba 터미널: 하루에 100만 건의 로그인 요청, 8G 메모리, JVM 매개변수를 설정하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Java后端技术全栈에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
이전 기사:SF기술인터뷰다음 기사:SF기술인터뷰