1.堆内存

堆内存用于存储new对象,垃圾回收器负责堆内存的管理。但Java程序实际占用的空间则由堆内存、栈内存(程序运行栈)、程序计数器、常量区、代码区、本地内存等。

堆内存分为Young和Old,Young分为2个Survivor (From Survivor和To Survivor),1个eden,具体见JVM系列-垃圾回收

-Xms??[m|g]

初始堆内存大小,默认为物理内存的1/64,单位是Byte

-Xmx??[m|g]

最大堆大小,默认为物理内存的1/4,单位是Byte。虽然程序申请了内存空间,但物理内存还是由程序实际需要来分配(这就是计算机原理了,虚拟地址空间和物理内存的关系)。

-XX:NewRatio = ??

Young与Old的分配,默认为2(young:old=1:2),NewRatio越大,old空间越大。

–XX:SurvivorRatio = ??

Survivor与Eden的分配,默认为8(Survivor:Eden=1:8),SurvivorRatio越大,Eden区间越大。注意这是一个Survivor与Eden的比例,所以Young如果分成10份,则2个Survivor共占2份,Eden占8份。

内存大小和GC的关系

大内存空间:减小GC执行次数,增加单次GC执行时间;小内存空间:减小单次GC执行时间,增加GC执行次数

查看默认值

java -XX:+PrintFlagsFinal -version | grep NewRatio 查看NewRatio

java -XX:+PrintFlagsFinal -version | grep -i heapsize 查看初始堆/最大堆的大小

2.打印GC日志

在程序优化的时候需要观察gc情况,所以需要设置一些参数。

-XX:+PrintGCDetails 打印GC详情,会显示Minor/Full gc的内存变化、持续时间等具体情况

-XX:+PrintGCDateStamps 打印GC日期类型的时间

-Xloggc:/home/work/log/gc.log GC日志存储路径

3.关于SafePoint

SafePoint是线程状态,表示线程目前处于一个稳定状态,可以停止或进行其他调度,GC等其他操作需要SafePoint。SafePoint的特定代码位置主要有:循环末尾、方法return前、方法call返回后、异常抛出位置等。

打印SafePoint信息,显示程序停止时间

-XX:+PrintApplicationStoppedTime(程序暂停了多少时间) -XX:+PrintGCApplicationConcurrentTime(两次连续暂停的时间间隔)

打印引起SafePoint的操作、线程运行情况等

-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1

如下图可以看出引起STW(Stop the World)的操作有Depotimize/GC/RevokeBias等,这些操作都需要等待程序处于SafePoint状态。

no  vm operation说明是一个保证安全点GuaranteedSafepoint(具体作用待续),默认每秒执行一次。

查看GuaranteedSafepoint的时间间隔:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal 2>&1 | grep Safepoint

设置间隔时间:

-XX:GuaranteedSafepointInterval=0 (关闭) -XX:GuaranteedSafepointInterval=1000 (1000ms)

4.何时需要GC优化

GC应该是程序优化的最后一步,GC执行的次数与创建对象的数量成正比,GC次数多的时候应该首先减少创建对象的数量。

满足以下条件无需GC:

  • Minor GC执行的很快(小于50ms)
  • Minor GC执行的并不频繁(大概10秒一次)
  • Full GC执行的很快(小于1s)
  • Full GC执行的并不频繁(10分钟一次)

可以通过jstat -gcutil pid来查看GC情况,S0/S1/E/O/P分别表示survivor、eden、old、permanent空间已用百分比,YGC/YGCT表示Young GC的次数和总共耗时(单位秒),FGC/FGCT表示Full GC的次数和总耗时,GCT=YGCT+ FGCT。

GC一些原则:

  • 通常-Xms1024m -Xmx1024m -XX:+UseG1GC就满足了需要
  • 初始堆大小和最大堆大小相等,避免堆空间的调整
  • 避免使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小

JVM系列-常用参数的更多相关文章

  1. JVM 配置常用参数和常用 GC 调优策略

    链接:https://juejin.im/post/5c94a123f265da610916081f   JVM 配置常用参数 堆参数 回收器参数 如上表所示,目前主要有串行.并行和并发三种,对于大内 ...

  2. JVM CMS 常用参数配置(修订)

    搜集到的一些参数内容,比较有用,大部分转载自并发编程网ifeve.com. -XX:+UseConcMarkSweepGC该标志首先是激活CMS收集器.默认HotSpot JVM使用的是并行收集器. ...

  3. JVM系列第12讲:JVM参数之查看JVM参数

    今天要说的是如何查看 JVM 中已经设置的参数,包括显示参数和隐式参数. 打印显式参数 -XX:+PrintVMOptions 该参数表示程序运行时,打印虚拟机接受到的命令行显式参数.我们用下面的命令 ...

  4. HotSpot JVM常用参数设置

    转自:https://www.zybuluo.com/jewes/note/57352 选项的分类 Hotspot JVM提供以下三大类选项: 1. 标准选项:这类选项的功能是很稳定的,在后续版本中也 ...

  5. jvm常用参数设置 good

    1.堆的大小可以通过 -Xms 和 -Xmx 来设置,一般将他们设置为相同的大小,目的是避免在每次垃圾回收后重新调整堆的大小,比如 -Xms=2g -Xmx=2g 或者 -Xms=512m -Xmx= ...

  6. JVM的内存划分以及常用参数

    JVM的主要划分为: 堆内存,虚拟机栈,方法区,程序计数器,本地方法栈 堆内存: 这部分区域是各个线程共享的,java的大部分对象都是储存在堆中. 1.堆在分配对象内存区域的时候可以分为两种,第一种叫 ...

  7. JVM调优常用参数

    JVM常用参数配置 -Xmx2048m 最大堆大小 -Xms1024m 初始堆大小 -Xmn1024m 年轻代大小 -XX:SurvivorRatio=8 Eden区与Survivor区的大小比值,设 ...

  8. JVM系列三:JVM参数设置

    JVM系列三:JVM参数设置.分析   不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM.GC的参数,可以极大的减少由于GC工作,而导致的程序运 ...

  9. HotSpot JVM常用参数(选项)设置

    本文讨论的选项是针对HotSpot虚拟机的. 1.选项分类及语法 HotspotJVM提供以下三大类选项: 1.1.标准选项 这类选项的功能是很稳定的,在后续版本中也不太会发生变化. 运行java或者 ...

随机推荐

  1. Carousel 旋转画廊特效的疑难杂症

    疑难杂症 该画廊特效的特点就是前后元素有层级关系. 我想很多人应该看过或者用过这个插件carousel.js,网上也有相关的教程.不知道这个插件的原型是哪个,有知道的朋友可以告诉我. 该插件相对完美, ...

  2. 从Vue.js窥探前端行业

    近年来前端开发趋势 1.旧浏览器逐渐淘汰,移动端需求增加: 旧浏览器主要指的是IE6-IE8,它是不支持ES5特性的:IE9+.chrome.sarafi.firefox对ES5是完全支持的,移动端大 ...

  3. Unity3D 5.3 新版AssetBundle使用方案及策略

    1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...

  4. STM32F429 LCD程序移植

    STM32F429自带LCD驱动器,这一具有功能给我等纠结于屏幕驱动的程序员带来了很大的福音.有经验的读者一定有过这样的经历,用FSMC驱动带由控制器的屏幕时候,一旦驱动芯片更换,则需要重新针对此驱动 ...

  5. c#比较两个数组的差异

    将DataTable中某一列数据直接转换成数组进行比较,使用的Linq,要引用命名空间using System.Linq; string[] arrRate = dtRate.AsEnumerable ...

  6. Android—ListView条目背景为图片时,条目间距问题解决

    ListView是android开发中使用最普遍的控件了,可有的listView条目的内容颇为丰富,甚至为了美观,背景用指定图片,如下图:

  7. jira的插件开发流程实践

    怎么开头呢,由于自己比较懒,博客一直不怎么弄,以后克己一点,多传点自己遇到的问题和经历上来,供自己以后记忆,也供需要的小伙伴少走点弯路吧 最近公司项目需要竞标一个运维项目,甲方给予了既定的几种比较常用 ...

  8. Openfire阶段实践总结

    从3月开始研究Openfire,其实就是要做一套IM系统,也正是这个原因才了解到Openfire.之前还真没想过有这么多的开源产品可以做IM,而且也没想到XMPP这个协议竟然如何强大.看来还是标准为先 ...

  9. 一步步开发自己的博客 .NET版 剧终篇(6、响应式布局 和 自定义样式)

    前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做 ...

  10. MVVM大比拼之avalon.js源码精析

    简介 avalon是国内 司徒正美 写的MVVM框架,相比同类框架它的特点是: 使用 observe 模式,性能高. 将原始对象用object.defineProperty重写,不需要用户像用knoc ...