JVM 튜닝 및 메모리 할당 계획 (기초 JDK1.8)

1. 소개

가장 일반적인 자바 프로그래밍 언어 중 하나 인 자바는 기본 JVM Java 프로그램 언어의 핵심이다. 엔터프라이즈 애플리케이션에 상관없이, 모바일 데이터 터미널 또는 넓은 지역은 큰 시장 점유율을 가지고있다. 자바는 C / C에 비해 점점 더 인기의 빠른 발전으로 평평하지만, ++, 같은 가비지 수집 메커니즘에 같은 자바 언어의 일부 결함. 가비지 컬렉션 무엇, 그것은 Java 또는 C / C ++ 우려에 대한 여부, 간단한로 나온 모든 객체, 객체가 생성 될 때, 우리는 팀 또는 스택 공간을 할당해야합니다입니다. 객체가 인스턴스화 될 때, 그것은 인용되지 않았을 수 있습니다. 여기가, 문제가 즉시 참조 후 회복되지 않을 경우, 객체가 인용되지 않음을 확인합니다. 자바와 C / C ++에서이 두 가지 제도입니다. 객체가 참조하고 자원을 재활용 객체를 해제되지 않은 자신의 심사에 필요한 C / C ++ 개발자. 그러나 자바에서 자바 () 메소드가 마무리 목적으로 C / C ++ 기능을 유지할 수 있지만, 자동으로 가비지 컬렉션, 그러나 두는 것이 좋습니다 자바 개발자 것이다 가비지 컬렉션 JVM이 작동합니다. 그래서 정말 성능 자바 프로그램 또는 응용 프로그램 개발 시스템을 향상시키고 자하는, 우리는 JVM에 대한 깊은 이해가 있어야합니다, 이것은 최적화 프로그램이 될 것입니다. Jdk1.8이 게시물은 JVM의 몇 가지 일반적인 코어 및 최적화를 소개합니다.

2.JVM 레이아웃

메모리는 매우 중요한 시스템 리소스, CPU 및 실시간 운영 체제 및 응용 프로그램을 운반하는 하드 디스크의 저장 및 중간 다리입니다. JVM 메모리 레이아웃은 JVM의 효율적이고 안정적인 작동을 보장하기 위해 운영, 유통 및 경영 전략 동안 Java 응용 프로그램 메모리를 제공한다.

2.1.를 눌러 메모리 레이아웃

2.2. 레이아웃은 스레드가 공유

2.3. 힙 (힙)

나에게 당신은 JVM과 자바 개발자 대해 할 일이있는 경우 힙 (예를 들어, 빨간색으로 표시) 2.1 메모리 레이아웃, 힙 메모리 영역은 모든 스레드, 거의 상점에 의해 공유되는 지역의 가장 큰 조각 알 이유에 대해 얘기하자 거의 모든 개체의 인스턴스 객체의 거의 모든 인스턴스 때문에 스택에 이스케이프 JIT 컴파일러 분석 기술의 성숙의 개발, 유통, 스칼라 교체 최적화 기술과 함께, 왜 여기에 오히려 사용이 거의 확실 이상 (힙에 할당 일부 미묘한 변화가 발생합니다, 모든 객체는 힙에 할당되어 점차적으로) 덜 "절대적으로"는된다. 거의 모든 작성된 오브젝트 장소이기 때문에, 다음 힙 가비지 컬렉터에 의해 관리되는 메인 천연 영역은 또한 힙 GC로 알려져있다.

기본 과제가. 힙

나. 당신은 할당 된 명령 비율을 볼 수 있습니다
$:java -XX:+PrintFlagsFinal –version

백이 명령 출력됩니다 몇 줄, 우리가 관련된 두 개의 매개 변수 및 힙 메모리 할당을 참조

uintx   InitialSurvivorRatio=8
uintx   NewRatio=2

매개 변수 세부 정보 :
InitialSurvivorRatio초기의 에덴 / Survicor 공간 비율의 차세대
NewRatio메모리 영역 비율 올드 / 젊은 지역

새로운 세대가되기 때문에 Eden + S0 + S1구성 메모리 크기가 다음 두 지역을 지역 40M 에덴 경우, 그래서, 위의 기본 확장에 생존자 5M한다 따르면, 젊은 전체 영역은 50M, 다음 메모리 영역의 크기를 계산 올드 100M, 힙 수석의 크기는 150M입니다.

조정 하였다. 힙 영역

Java 가상 머신 사양에 따라, 자바 힙은 우리의 디스크 공간과 같은에 한 논리적 연속, 비 연속 물리적 메모리 공간에있을 수있다. 구현 될 때 하나의 고정 사이즈는 런타임에 동적으로 조절 될 수 있으므로, 그것으로 구현 될 수있다.
예를 들어, 초기 값과 힙의 최대 값으로 설정 될 수있는 다음과 같은 파라미터를 설정함으로써, -Xms256M-Xmx1024M문자가 -X 그것을 JVM 런타임 파라미터들을 나타내고, 상기 MS가 메모리 시작 초기 값 메모리 중국어 수단이라, MX는 메모리 최대 인 단, 최대 메모리를 의미한다.

2.4 메타 영역

MetaSpace 영구 특성과 유사한,이 메소드 영역 JVM의 사양에 달성된다. 그러나 위안화 그 대신 영구 공간 사이의 가장 큰 차이점은 : 위안은 가상 머신 공간,하지만 로컬 메모리를 사용하지 않습니다. 따라서, 기본적으로 로컬 메모리 제한에 의한 요소 공간의 크기입니다.
자바 프로그램의 순서도 2.1 소개 2.2 힙은 힙의 거의 모든 오브젝트를 알 수 있습니다. 메타 데이터 지구, 상수 풀의 경우, 저장 공간의 방법 메타 정보 영역 자원과 메타 정보 클래스를 점령했다. 이러한 유형의 정보를 들어, 자바 프로그램은 자원 정보의 양이 프로그램의 성능에 힙 메타 데이터를 적은 영향에 상대적으로 고정되어 점유 시작합니다.
메타 데이터 공간 매개 변수를 최적화 :

3. 개체 수명주기

위의 설명에서 우리는 자바 객체를하는 위치를 알 수 있지만 충분하지 만 정말 더 나은 최적화를 수행하기 위해 객체 및 메모리 할당 프로세스의 라이프 사이클을 이해합니다.

로드 영역이 에덴 작성시 에덴 지역에있는 개체의 대부분은, 트리거를 생성 YoungGarbageCollectionYGC있다. 쓰레기 수집 시간은, 객체는 직접 복구를 참조되지, 에덴 영역에서 명확한 전략을 얻을 수 있습니다. 아직 살아 객체는 생존자 영역에 전송됩니다. 서바이버 (S1) 등 두 개의 메모리 공간으로 분할. YGC 때마다, 그들이 사용되지 않는 공간의 조각에 복사 객체를 살 것이다, 그 공간은 현재 두 개의 교환 공간의 상태를 사용하여 완전히 제거 사용. YGC가 전송되는 객체 상한 생존자 지역의 용량보다 큰 경우, 바로 이전 시대에 넘겨. 십팔년에 사람이 성인이 될 것 같은 객체는 항상 JVM의에서, 새로운 세대에 머물 수없는 -XX:MaxTenuringThreshold물체가 노년의 문턱에 새로운 세대에서 승진 구성 매개 변수를 설정합니다. 지역에서 교환 생존자 14 시간 이전 시대로 승격 된 후 기본값은 15입니다.

4. jvisualvmJVM을 GC 모니터링

4.1. 설치 Visual GC플러그인을

在jdk的bin目录下有一个jvisualvm.exe,这个程序是jvm自带的对jvm的全方位监控,但需要安装对应的插件。这里只介绍对GC的监控。
运行jvisualvm.exe

工具->插件->设置

这里更改插件中心的代理,一般配置为一下代码:
https://visualvm.github.io/archive/uc/8u40/updates.xml.gz
但需要对应你的jdk版本

配置好后再插件中选择可用插件,勾选Visual GC点击安装

4.2.利用jvisualvm对java程序进行JVM GC监控

a.程序
package com.surfilter;

import java.util.LinkedList;
import java.util.List;

public class ChDDLDemo {
    public static void main(String args[]) throws Exception{
        System.out.println("HelloGC!");
        List list = new LinkedList();
        for(;;) {
            byte[] b = new byte[1024*1024];
            Thread.sleep(500);
            list.add(b);
        }
    }
}

该程序的逻辑十分简单,再一个死循环中不断的new新的对象,这个程序最终是会出现异常的。

b.启动程序运用Visual GC监控

当程序启动后可以看到本地有这个程序的类(当然也可以进行远程的java程序的监控),双击这个类,可以看到该程序的一些信息,点击Visual GC,会出现以下信息

监控是实时的,可以看到Metaspace是保持不变的,Old区,Eden区,S0,S1区都是在实时更新的,同时在右侧依次往下可以看到编译的时间,GC的回收的时序关系,S0区的内存时序关系,S1区的内存时序关系,Old区的时序关系以及Metaspace的时序关系。从监控图的实时状态中可以看出与对象的周期架构完全符合,等待该程序出异常,来查看这个监控在出现异常和正常执行之间的区别

现在来看Visual GC的监控图

可以看出Old在上升直到满了导致程序异常,而且整个过程都在频繁的进行GC。如果在生产环境的程序GC出现如上图的情况,肯定性能会打折扣,深圳导致生产环境程序崩溃。如果要避免这些问题,第一要素是使堆在每个区都有空间,第二要素是使程序不会过多的进行GC。这就是JVM优化调优的核心。针对于第二点要从代码规范层面上着手,避免过多的不用对象。第二点则是针对于JVM的参数调优,在实际的开发中,两种情况都会有,但第一种可能更为常见,接下来具体将针对的JVM的参数调优。

5.JVM调优

调优更多的实际应用中进行的,正如某位大神说的,没有业务场景的调优都是耍流氓。这里只是提供一些调优的方案。
如上2.3的c对堆区的大小调整和对元数据的资源占用的调整,还有很多的调优方案

5.1.调优的步骤

a.熟悉业务场景(没有最好的垃圾回收器,只有最合适的垃圾回收器)
b.了解程序的响应时间、停顿时间
c.调研吞吐量 = 用户时间 / 用户时间 + GC时间
d.选择回收器组合
e.计算内存需求
f.设定年代大小、升级年龄
g.设定日志参数

-Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause
观察日志情况

5.2.两个核心的JVM优化方案

a.尽量减少YoungGC,以减少代码停顿
b.尽量减少FullGC,以减少系统停顿

在4.2中监控可以看出GC的次数非常多,GC分为YoungGC和FullGC,可见YoungGC和FullGC是非常多的,一天最多 FullGC 一次,最好在系统空闲期(如深夜)

5.3.参数级调优

选项 -Xms300M -Xmx300M -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:PermSize=100M -XX:MaxPermSize=100M 含义为:

  • 永久代固定尺寸为 100M;
  • 整个堆固定尺寸为 300M,其中“老年代 / 新生代”为-XX:NewRatio=2,所以老年代为 200M,新生代为 100M;
  • 新生代总共 100M,其中“Eden / Survivor0”为-XX:SurvivorRatio=8,所以 Eden 为 80M,Survivor0=Survivor1=10M。
    可以对以上参数适当的加大
    官方资料:http://www.oracle.com/technetwork/articles/java/vmoptions-jsp-140102.html
    实际的参数级调优方案很多,可以参照oracle官网

추천

출처www.cnblogs.com/jiashengmei/p/12217949.html