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. TanksWar(坦克大战三维、二维版以及90版)

    本文已迁移至:https://coco56.blog.csdn.net/article/details/103198945

  2. linux格式化磁盘命令

    linux格式化磁盘命令           linux mkfs         指令:mkfs 使用权限 : 超级使用者 使用方式 : mkfs [-V] [-t fstype] [fs-opti ...

  3. Ubuntu18.04 安装redis

    Redis是常用基于内存的Key-Value数据库,比Memcache更先进,支持多种数据结构,高效,快速.用Redis可以很轻松解决高并发的数据访问问题:作为实时监控信号处理也非常不错. 安装red ...

  4. samba服务及vsftpd服务

    如何配置多个网卡 第一步: 打开设置,选择网络驱动器添加 第二步: ip a 查看网卡是否添加成功 第三步: 打开刚添加的网卡配置文件(注意,你刚添加的网卡是没有配置文件的,需要去复制一份到/etc/ ...

  5. 总结下Nginx的功能模块

    nginx-1.10.3]# ./configure  \ --prefix=/usr/local/nginx   \        #指定安装路径 --user=nginx --group=ngin ...

  6. LB_GETCURSEL和LB_GETTEXT的使用

    case IDC_LIST1: { switch (HIWORD(wParam)) { case LBN_DBLCLK: { HWND hwndList = GetDlgItem(hDlg, IDC_ ...

  7. chrome模拟慢速3G网络

    谷歌调试控制台中network中可以设置,add为自定义

  8. WinServer2008R2远程桌面长时间保持连接

    开始------运行------gpedit.msc 计算机配置------管理模板-----Windows组件-----远程桌面服务------远程桌面会话主机------会话时间限制 修改两项设置 ...

  9. 《Spring源码深度解析》一

    Spring整体架构 1.1 Spring整体架构 1.1.1 Core Container: 模块:Core.Beans.Context和Expression Language Core:框架的基础 ...

  10. Mybatis-Plus和Mybatis的区别

    1.List item 区别一如果Mybatis Plus是扳手,那Mybatis Generator就是生产扳手的工厂.通俗来讲——MyBatis:一种操作数据库的框架,提供一种Mapper类,支持 ...