Jvm的内存由三部分组成Eden,S0,S1,Old以及Metaspace(JDK1.8之前的Perm区)五部分组成;

(图片摘自VisualVM的Visual GC插件)

  抽象为三代:新生代(Eden,S0,S1);老年代(old)以及持久代(Metaspace/Perm);

  java -server -Xms100m -Xmx2g -XX:NewSize=100m -XX:SurvivorRatio=8 cs.jar

  -server表示Jvm运行模式是服务器,服务器的特点就是启动慢,但是运行过程中内存比较平稳;客户端想反,启动比较快,但是长期运行来看性能等步入服务器好。

  设定大小,Xms100m是堆的初始大小为100m,新生代以及老年点的初始化总大小,对于持久代而言,不属于堆空间,属于栈空间(从大面来讲,JVM内存区分为两部分,堆空间和栈空间(perm/metaspace);堆空间,又可以细分为Eden,Survivor0,Survivor1三部分);常量,方法区空间分配等都是会使用持久代空间,所以这部分空间也是比较稳定(除非使用动态技术加载新类,导致增加空间分配方法区等);Xmx2g,堆最大空间为2G;

  推荐堆空间为内存空间的1/4,-Xmn150m指定Eden大小;-XX:NewSize=100m是指分配的新生代的初始化大小(包括Eden,S0以及S1总大小)。如下图所示:Eden Space以及S0,S1大小都有两个值,比如Eden Space里面是483.000M,88.000M,就是指Eden最大空间为483(有-Xmn指定),88M则是指初始化分配大小为88M,而且只要达到了这个88M就会尝试进行回收。因为达到了88之后并不能马上进行回收,只是设定了“安全点”,要等到所有的线程都跑到了“安全点”才能够进行回收,所以,在这个过程中还是需要继续分配内存,所以在指定Xmn以及NewSize的时候,要保证Xmn的大小要大于NewSize分配的值。

  注:在jvm args中有的-X,有的是-XX:,两者区别在于-X是稳定的,各个版本的jvm都支持,包括前后兼容;但是-XX则是不稳定,并不保证各个版本间延续,兼容。

  讲了EdenSpace空间的分配,那么Survivor的分配呢?首先要了解Eden以及Survivor之间的组合实现的“复制”机制,然后是商用Jvm设计的两者关系是按照比例的,Sun推荐两者比例是8,即Eden占80%,两个Survivor各占10%,IBM曾经有一个调查支持这个比例,就是98%的对象是“朝生夕死”的,所以复制到的空间设计的可以小一些。下图是没有设置XX:SurvivorRatio,看得出来默认值是3:1:1,Eden60%,Survivor各占20%,如果指定值为8之后,Survivor大小变成了48M,但是最小的空间大小并没有发生变化;可见-XX:NewSize分配大小就是默认的8:1:1,并不受SurvivorRator影响太大(即使相同的surviorRatio,每次启动JVM分配空间也有些许偏差)。

  1.通过VisualGC需要跟踪的对于新生代的回收是否过于频繁,如果频繁说明你设置的NewSize大小有问题,尝试调整高一些。调整新生代,老年代的大小是一个平衡,就是空间大,GC次数少,但是一次GC时间可能长(因为空间大了);所以在大小方面需要进行调试,一次GC控制在几毫秒,不是很频繁是可以接受的。

  2.要关注老年代的回收,因为老年代回收将会触发Full GC,即全堆的回收,所以停顿时间(Stop-Of-The-World)会比较长,对于老年代要留有足够的空间,避免Full GC间隔较短就触发。

  3.对于高吞吐量的场景下,在VisualVM的Monitor监控下发现内存使用长期持续在300M(-XX:NewSize=300M),形成一片,这是正常的,首先jvm声明了新生代总大小为300M,那么内存就会在高吞吐场景下上扬到300之后,迅速下降(垃圾回收),所以在VVM中时间点之间的距离将会越来越小(vvm将会尝试在一个折线图展示从开始监控到当前时间点的数据),形成一片,说明有增加有释放,因为是高吞吐量,所以内存会不断上升;因为有Minor GC所以会不断回收,所以这个持续过程是正常的

Jvm组成以及调优的更多相关文章

  1. Java系列笔记(4) - JVM监控与调优

    目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之.通过学习,我觉得JVM ...

  2. JVM监控与调优

    目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     转:http://www.cnblogs.com/zhguang/p/java-jvm-gc.html光说不练假把式,学习J ...

  3. [java] JVM监控与调优

    原文出处:http://www.cnblogs.com/zhguang/p/java-jvm-gc.html   光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分 ...

  4. Tomcat性能调优-JVM监控与调优

    参数设置 在Java虚拟机的参数中,有3种表示方法用"ps -ef |grep "java"命令,可以得到当前Java进程的所有启动参数和配置参数: 标准参数(-),所有 ...

  5. JVM监控和调优常用命令工具总结

    JVM监控和调优 在Java应用和服务出现莫名的卡顿.CPU飙升等问题时总是要分析一下对应进程的JVM状态以定位问题和解决问题并作出相应的优化,在这过程中Java自带的一些状态监控命令和图形化工具就非 ...

  6. 深入理解java:1.3.2 JVM监控与调优

    学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之. 本篇,来看看[ 如何监控和优化GC机制.] 通过学习,我觉得JVM监控与调优,主要在3个着眼点上: 1,如何配置 ...

  7. Java系列笔记(4) - JVM监控与调优【转】

    Java系列笔记(4) - JVM监控与调优[转]   目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在 ...

  8. 2020年薪30W的Java程序员都要求熟悉JVM与性能调优!

    前言 作为Java程序员,你有没有被JVM伤害过?面试的时候是否碰到过对JVM的灵魂拷问?   一.JVM 内存区域划分 1.程序计数器(线程私有) 程序计数器(Program Counter Reg ...

  9. [JVM教程与调优] 什么是JVM运行时参数?

    我们接着上一章节[JVM教程与调优] JVM都有哪些参数类型?的内容继续讲解,这章我们来介绍一下:如何查看JVM运行时参数.这一点十分重要,因为我们在进行JVM参数调优的时候,我们首先得知道目前系统运 ...

  10. [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出

    在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...

随机推荐

  1. oracle分页查询按日期排序失败问题

    今天对已经上线的代码进行测试,结果发现分页是失效的,一度怀疑是前台页面分页失效,排查后发现是分页sql有问题,分页sql按日期排序,导致分页失败. 按日期排序,会造成相同的数据重复出现. 解决方案:在 ...

  2. Qt设置生成的exe文件图标

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_37354286/article/d ...

  3. Linux 学习 (一)

    最常用的7个Linux命令: cd:切换目录. pwd:查看当前所在目录. ls:查看目录下的文件. touch:没有文件则创建文件. mkdir:创建目录. mr:remove删除.         ...

  4. Codeforces 979 字符串强制N变换最多出现字母 DFS子树 暴力01字典树

    A /* Huyyt */ #include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define mkp(a,b) ...

  5. Monty 大厅问题(Monty Hall Problem)也称作三门问题,出自美国大型游戏节目 Let's Make a Deal。

    Monty 大厅的问题陈述十分简单,但是它的答案看上去却是有悖常理.该问题不仅引起过很多争议,也经常出现在各种考试题中. Monty 大厅的游戏规则是这样的,如果你来参加这个节目,那么 (1)Mont ...

  6. python类库32[序列化和反序列化之pickle]

      一 pickle pickle模块用来实现python对象的序列化和反序列化.通常地pickle将python对象序列化为二进制流或文件.   python对象与文件之间的序列化和反序列化: pi ...

  7. 'gbk' codec can't decode byte 0xad in position 12: illegal multibyte sequence

    原文链接:https://blog.csdn.net/shijing_0214/article/details/51971734 使用python的时候,经常会遇到文本编码的问题,其中最常见的就是“' ...

  8. DB2的HADR

    db2stop force; db2start; db2 restore db clmsdb; db2 start hadr on db clmsdb as standby; ************ ...

  9. 由于代码环境有dev test prod ,每次提交代码需要很多环境,shell脚本即可解决重复命令问题

    在项目外面写入push.sh 内容为 if [  $1!='' ] then    msg=$1; else    msg='bug'; fi   git add .  git commit -m $ ...

  10. 扑克牌中的顺子(网易2014.3.16笔试offerP226)

    题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的.2~10为数字本身,A为1,J~K为11,12,13,而大小王可以看成任意数字.(网易要求必须用C完成,可以用C库函数) ja ...