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. Laravel-admin 加载视图后,blade 模板 JS 失效

    laravel-admin js无法解析 解决 在不需要使用 pjax 的地方使用 Admin::disablePjax();

  2. mydql 设置充许远程链接

    1 本机作为服务器时,其他机器连接不上? 1)看一下防火墙是否打开了. 2)在cmd中设置权限. 第一种:(进入数据库的情况下) 1.d:\mysql\bin\>mysql -h localho ...

  3. 监控mysql的存储引擎

    监控mysql 显示进程状态变量 mysql> show variables like '%thread%'; +----------------------------+----------- ...

  4. PHP漏洞函数

    1. is_numeric函数 bool is_numeric ( mixed $var ) 此函数用于判断变量是否数字或者数字字符串,不仅能接受十进制,还能接受十六进制,这样就有了绕过的方法 < ...

  5. ThinkPHP中的SQL结果分析

    ThinkPHP中的SQL结果分析 在进行结果判断时需要注意. 一.查询SQL: 可能出现的情况:1.查询成功,返回正常数据.2.查询成功,但是没有数据,返回NULL.3.查询错误,写错关键字.结果: ...

  6. 清北学堂提高组突破营游记day6

    还有一天就结束了..QWQ 好快啊. 昨天没讲完的博弈论DP: 一个标准的博弈论dp,一般问的是是否先手赢. 博弈论最关键的问题:dp过程. 对于一个问题,一定有很多状态,每个状态可以转移到其他的一些 ...

  7. svn 服务器的搭建以及客户端的使用

    1.svn 服务器的搭建以及客户端的使用,安装见下面的博客 https://blog.csdn.net/zh123456zh789/article/details/80921179 说明:服务器只是用 ...

  8. Shiro(一)

    1 权限管理 1.1 什么是权限管理? 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问权限的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自 ...

  9. safari兼容时间格式 NAN

    问题: safari中不支持2018-08-01这种格式转为时间戳会显示NaN 方案: new Date('2018/08/01').getTime() 将-转化为/ // 正则替换 new Date ...

  10. JSP 和Servlet 有有什么关系?

    Servlet是一个特殊的Java程序,它运行于服务器的JVM中,能够依靠服务器的支持向浏览器提供显示内容. JSP本质上是Servlet的一种简易形式, JSP会被服务器处理成一个类似于Servle ...