JVM调优-新生代

JAVA虚拟机新生代,包括eden space+2个survivor空间。

新生代用来存放新近创建的对象,新生代的特点是对象更新速度快,在短时间内产生大量的“死亡对象”。对年轻代的垃圾回收称作次级回收 (minor gc)

1、新生代与次级回收

新生代分为三个区域,  一个eden spac , 2个大小相同的survivor,  应用程序只能使用一个eden和一个survivor, 当发生初级垃圾回收的时候,gc挂起程序, 然后将eden和survivorA中的存活对象复制到另外一个非活动的survivorB中,然后一次性清除eden和survivor,将原来的survivorB标记成为survivoA.    将在指定次数回收后仍然存在的对象移动到老年代中, 次级回收后,得到一个空的可用的eden.

JVM调优主要是针对内存管理方面的调优,包括控制各个代的大小,GC策略。由于GC开始垃圾回收时会挂起应用线程,严重影响了性能,调优的目是为了尽量降低GC所导致的应用线程暂停时间、减少Full
GC次数。

2、新生代大小调优

新生代最关键参数:-Xms、 -Xmx
、-Xmn
、-XX:SurvivorRatio、-XX:MaxTenuringThreshold、-XX:PermSize、-XX:MaxPermSize

-Xms、 -Xmx
通常设置为相同的值,避免运行时要不断扩展JVM内存,这个值决定了JVM heap所能使用的最大内存。

-Xmn 决定了新生代空间的大小,新生代Eden、S0、S1三个区域的比率可以通过-XX:SurvivorRatio来控制(假如值为
4  表示:Eden:S0:S1 = 4:3:3 )

-XX:MaxTenuringThreshold
控制对象在经过多少次minor GC之后进入老年代,此参数只有在Serial
串行GC时有效。

-XX:PermSize、-XX:MaxPermSize
用来控制方法区的大小,通常设置为相同的值。

1.避免新生代大小设置过小

当新生代设置过小时,会产生两种比较明显的现象,一是minor GC次数频繁,二是可能导致 minor GC对象直接进入老年代。当老年代内存不足时,会触发Full
GC。

2.避免新生代设置过大

新生代设置过大,会带来两个问题:一是老年代变小,可能导致Full  GC频繁执行;二是 minor GC
执行回收的时间大幅度增加。

3.避免Survivor区过大或过小

-XX:SurvivorRatio参数的值越大,就意味着Eden区域变大,minor
GC次数会降低,但两块Survivor区域变小,如果超过Survivor区域内存大小的对象在minor
GC后仍没被回收,则会直接进入老年代;

-XX:SurvivorRatio参数值设置过小,就意味着Eden区域变小,minor
GC触发次数会增加,Survivor区域变大,意味着可以存储更多在minor GC后任存活的对象,避免其进入老年代。

4.合理设置对象在新生代存活的周期

新生代存活周期的值决定了新生代对象在经过多少次Minor GC后进入老年代。因此这个值要根据自己的应用来调优,Jvm参数上这个值对应的为-XX:MaxTenuringThreshold,默认值为15次。

3、查看2个survivor空间交换的源代码

源代码,仅供参考

package com.gc;

import java.util.ArrayList;

import java.util.Random;

/**

* 简单的应用,能够看到survivor空间交换,用JDK自带的jstat查看

* 参数:-Xms30m -Xmx60m

*

* @author 范芳铭

*/

public class EasySurvivorChange {

public byte[] placeHolder =new byte[1 * 1024]; //
占位符

public static void main(String[]args) throws Exception {

while (true) {

Random random =new Random();

int loops =random.nextInt(10000);

EasySurvivorChangejstat = new EasySurvivorChange();

System.out.println("......正在构建对象:" + loops + "(个)");

jstat.getLoop(loops);//多次循环,产生大量对象

Thread.sleep(10);

}

}

public void getLoop(int size){

ArrayList<EasySurvivorChange>list = new ArrayList<EasySurvivorChange>();

for (int i = 0; i <size; i++) {

EasySurvivorChangejstat = new EasySurvivorChange();

list.add(jstat);

}

}

}

4、用jstat查看survivor空间交换

C:\Program Files\Java\jdk1.6.0_25\bin>jps

8068 Jps

2384

7248 EasySurvivorChange

C:\Program Files\Java\jdk1.6.0_25\bin>jstat -gc 7248  250 6

S0C    S1C    S0U   S1U      EC       EU

128.0   64.0   0.0   63.8   1024.0    0.0

128.0  128.0   0.0  127.6   1152.0    0.0

64.0   64.0   63.6  0.0    896.0     0.0

64.0   64.0   0.0   64.0   896.0     0.0

64.0   64.0   0.0   63.8   896.0     0.0

64.0   64.0   0.0   0.0    896.0     0.0

S0C表示当前S0的容量 (KB),S1C表示当前S1的容量
(KB),S0U表示当前S0使用的大小 (KB),S1U表示当前S1使用的大小(KB).我们知道,两个Survivor区的数据是进行交换标记的,在这里能够很明显看出,S0U和S1U的空间使用情况是在交替进行的。

时间: 2024-10-07 18:59:07

JVM调优-新生代的相关文章

JVM 调优 —— 新生代 Survivor 空间不足

零. 新生代调优规律 增大新生代空间, Minor GC 频率减少, Minor GC 时间上升. 减少新生代空间, Minor GC 频率上升, Minor GC 时间下降 一. 新生代典型问题 先看一段 GC 日志:新生代使用 ParNew, 老年代使用 CMS {Heap before GC invocations=0 (full 0): par new generation total 943744K, used 838912K [0x0000000757000000, 0x000000

JVM调优经验分享

前言 一.JVM调优知识背景简介 二.JVM调优参数简介 三.JVM调优目标 四.JVM调优经验 结束语 <br/> 本次分享探讨的JVM调优是指server端运行的JVM调优,适应版本为[1.6– 1.7], 不涉及最新的1.8版本. 假设线程池.连接池.程序代码等都已经做过优化,效果(系统吞吐量.响应性能)仍然不理想,我们就可以考虑JVM调优了. <br/> 一. JVM调优知识背景简介 1.堆与栈的概念 堆和栈是程序运行的关键:栈是运行时的单位,而堆是存储的单位. 栈解决程序

Tomcat的JVM调优实战

一些调优点在上篇日志中已写到,在此不做说明 直接使用Jmeter进行调优测试吞吐量Code package cn; import java.io.IOException; import java.util.Map; import java.util.WeakHashMap; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Htt

JVM调优及参数设置

(1)参数 -Xms:初始堆大小 -Xmx :最大堆大小 此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存 -Xmn :年轻代大小 整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8. -XX:NewSize:设置年轻代大小 -XX:MaxNewSize:年轻代最大值 -XX:NewRatio 年老代与年轻代的比值 -XX:SurvivorRat

JVM调优基础

一.JVM调优基本流程 1.划分应用程序的系统需求优先级 2.选择JVM部署模式:单JVM.多JVM 3.选择JVM运行模式 4.调优应用程序内存使用 5.调优应用程序延迟 6.调优应用程序吞吐量 二.选择JVM部署模式:单JVM.多JVM 1.单JVM 优点:不需要管理多个JVM,降低管理成本: 应用程序消耗内存数量较少 缺点:存在单点故障,一个JVM失效时,整个系统失效. 2.多JVM 优点:更好的可用性,避免单点故障:更低延迟,因为垃圾收集所产生的停顿是程序延迟的主要原因,多JVM减少了每

jvm原理及性能调优系列(jvm调优)

个人认为jvm调优主要通过以下方法解决 1.设置合适的最大堆内存(新生代和老生代的最大和值)和最小堆内存(jvm启动时占用的操作系统内存大小),及设置好堆的比例分配. 2.设置合适的新生代 因为对其对系统性能和GC回收有一定的影响. 3.设置合适的持久代 因为其直接决定系统可以支持多少个类定义和多少个常亮. 4.设置合适的线程栈 否则系统可能因为线程所需资源和空间不够而异常退出.

jvm 调优

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁.根据<Java虚拟机规范(第2版)>的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,虚拟机栈.本地方法栈.程序计数器为线程私有部分,虚拟机堆.方法区为共享部分),见下图: 程序计数器 程序计数器(Program Counter Register)是一块较小的内存

JVM调优知识

一.Java应用服务器 Tomcat.Nginx.Resin.等多种应用服务器,虽然JVM做为容器,提供的是一个Java Web的运行时环境,以支持Servlet/JSP等等这些内容的运行但是我们都很清楚,其本质上是还是一个Java应用程序.现在有哪些java应用服务器呢?商业的有BEA Weblogic Server.IBM Websphere Application Server.Oracle Application Server.Sybase EAServer.免费开源的java应用服务器

java虚拟机学习-JVM调优总结-调优方法(12)

JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 JProfiler:商业软件,需要付费.功能强大.详细说明参考这里 VisualVM:JDK自带,功能强大,与JProfiler类似.推荐. 如何调优 观察内存释放情况.集合类检查.对象树 上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能 堆信息查看 可查看堆空间大小分配(年轻代