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. [PyQt5]动态显示matplotlib作图(一)

    完整实例 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QVBoxLayout, QSizePoli ...

  2. windows挂载nfs

    注意:Win10 Creators Update前只有Win10企业版可以挂载NFS, Creators Update后专业版也可挂载NFS了. 安装 按Win+R输入OptionalFeatures ...

  3. mysql5.7使用gtid模式搭建主从复制架构

    一.架构 两台mysql服务器做一主一从,172.28.18.69(主) 172.28.18.78(从) 二.分别编译安装mysql5.7 1.下载mysql5.7.26源码包 [root@serve ...

  4. Awkward Response AtCoder - 2656 ( 二分+交互题)

    Problem Statement This is an interactive task. Snuke has a favorite positive integer, N. You can ask ...

  5. 区块链共识算法|RAFT和PBFT的区别

    这里有个很形象的比喻: 一个团队一定会有一个老大和普通成员.对于 raft 算法,共识过程就是:只要老大还没挂,老大说什么,我们(团队普通成员)就做什么,坚决执行.那什么时候重新老大呢?只有当老大挂了 ...

  6. MFC界面库BCGControlBar v30.1新功能详解:Dialogs和Forms

    亲爱的BCGSoft用户,我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v30.1正式发布!此版本包含themed find ...

  7. iOS中延迟执行和取消的几种方式

    公用延迟执行的方法: - (void)delayMethod { NSLog(@"delayMethodEnd"); } 方法一.performSelector 方法 1.延迟执行 ...

  8. R中的常用命令(持续更新)

    (1)工作环境 #Ctrl+L键:清屏#Ctrl+Shift+C键:注释.取消注释(仅在RStudio中)(可以多行) rm(变量) #清除某变量 ls() #列出内存中的变量 rm(list=ls( ...

  9. 3828. 三角形计数 3829. ZCC loves Isaac 3830. 字符消除

    3828 给定n个点的坐标(0<=xi,yi<=10000)求选出任意三个点能组成的三角形的总面积. 题解 太naive了 枚举三角形的y最小的点,把剩余的点按角度排序 然后随便算,可以用 ...

  10. 2018百度之星B轮 degree

    degree Accepts: 1581 Submissions: 3494 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/1 ...