如何攻击织梦做的网站,wordpress php设置,诚信档案建设网站首页,东莞网站优化推广方案1.触发垃圾回收的条件
新生代 Eden区域满了#xff0c;触发young gc (ygc)老年代区域满了#xff0c;触发full gc (fgc)通过ygc后进入老年代的平均大小大于老年代的可用内存,触发full gc(fgc).程序中主动调用的System.gc()强制执行gc,是full gc#xff0c;但是不必然执行。…1.触发垃圾回收的条件
新生代 Eden区域满了触发young gc (ygc)老年代区域满了触发full gc (fgc)通过ygc后进入老年代的平均大小大于老年代的可用内存,触发full gc(fgc).程序中主动调用的System.gc()强制执行gc,是full gc但是不必然执行。
2.垃圾回收流程
当Eden满后会触发young gc, 把有引用存活的对象复制到S0区域回收清空Eden区域。当Eden再次满后触发young gc, 把Eden和S0区域的存活对象复制到另一个S1区域收回清空Eden和S0区域。
2.GC问题排查流程
GC问题的排查流程主要包括观察GC日志、分析内存使用情况、寻找GC导致的性能问题、调整GC参数、使用垃圾收集器分析工具和进行压力测试和性能调优。根据具体情况可能需要结合多种方法和工具来诊断和解决GC问题。
也可以通过 使用jmap命令查某时刻的JVM堆信息查看占用比较高的对象
3.对象进入老年代的场景
对象首次创建会被放置在新生代的eden区 对象进入老年代主要有下面三种方式
大对象 比如很长的字符串、很大的数组等可通过参数-XX:PretenureSizeThreshold3145728设置超过这个参数设置的值就直接进入老年代
长期存活的对象 对象头中Header包含了 GC 分代年 龄标记信息。如果对象在 eden 区出生那么它的 GC 分代年龄会初始值为 1每熬过一次 Minor GC 而不被回收这个值就会增 加 1 岁。当它的年龄到达一定的数值时就会晋升到老年代中可以通过参数 -XX:MaxTenuringThreshold 设置年龄阀值默认是 15 岁
动态对象年龄判定 当 Survivor 空间中相同年龄所有对象的大小总和大于 Survivor 空间的一半。年龄大于或等于该年龄的对象就可以直接进入老年代而不需要达到默认的分代年龄。 4.GC年龄代为什么默认是15可以自定义吗 最大最小可以设置多少
这个默认值是根据实践经验和性能测试得出的可以尽可能的的保证垃圾回收效率的前提下减少移动到老年代的对象数量从而减少Full gc 最小是1,不可以设置为负数或0
最大值是15原因是对象的GC年龄存储在对象头里分配4bit存储转换为二进制就是15. 5.对象存活判定
由于程序计数器、栈、本地方法栈都是线程独享其占用的内存是随线程结束而回收。而Java堆和方法区则不同线程共享是GC的所关注的部分。
引用计数算法
给对象添加一个引用计数器当有一个地方引用对象是计数器加1当引用失效是计数器减1当该对象的计数器为0时表示可以回收。
可达性分析算法
从GC Roots对象作为起点向下搜索当一个对象不在GC Roots的引用链路中时该对象可以回收。
GC Roots对象包含方法区静态属性引用的对象、栈中引用的对象、本地方法栈中Native方法引用的对象、常量引用的对象。 从GC Roots开始把所有可以搜索得到的对象标记为存活对象固定可作为GC Roots的对象包括以下几种·
v 在虚拟机栈栈帧中的本地变量表中引用的对象譬如各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等。·
v 在方法区中类静态属性引用的对象譬如Java类的引用类型静态变量。·在方法区中常量引用的对象譬如字符串常量池String Table里的引用。
v 在本地方法栈中Native方法引用的对象。
v Java虚拟机内部的引用如基本数据类型对应的Class对象一些常驻的异常对象比如NullPointExcepiton、OutOfMemoryError等还有系统类加载器。
v 所有被同步锁synchronized关键字持有的对象。 GC 垃圾收集器
1.你知道哪些垃圾收集器
新生代收集器
串行-收集器 Serial (单线程、复制算法) [-XX:UseSerialGC]Parallel Scavenge 收集器多线程复制算法ParNew (Serial多线程 , 复制算法)[-XX:UseParNewGC] ParallelScavenge [-XX:UseParallelGC]
G1 (多线程标记清除算法)
老年代收集器
SerialOld(单线程、标记整理算法) [ -XX:UseSerialOldGC ]ParallelOld(多线程标记整理算法) [ -XX:UseParallelOldGC]CMS-XX:UseConcMarkSweepGC多线程标记清除法G1(多线程标记整理算法) [-XX:UseG1GC] G1是一个独立的收集器不依。ZGC是目前JDK 11的实验收集器。 2.你们项目中用的哪些
老年代用的 cms新生代用的 ParNew 使用复制算法完成垃圾收集 3.CMS
3.1 CMS的流程
初始化标记短暂的暂停工作线程标记出可达对象并发标记和用户线程并发执行跟踪对象重新标记暂停用户线程重新标记因程序运行而不可达的点并发清除和用户线程并发执行清除不可达对象。
初始标记(STW initial mark) 从垃圾回收的根对象开始只扫描到能够和根对象直接关联的对象并作标记。所以这个过程虽然暂停了整个JVM但是很快就完成了。标记GC Roots存活对象短暂stop the word
并发标记(Concurrent marking)和用户线程一起并发执行跟踪对象对GC Roots对象引用进行追踪标记存活 并发预清理(Concurrent precleaning)并发预清理阶段仍然是并发的。在这个阶段虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代 或者有一些对象被分配到老年代)。通过重新扫描减少下一个阶段重新标记的工作因为下一个阶段会Stop The World。
重新标记(STW remark)短暂暂停扫描在“并发标记”过程中被标记为可达或新创建的对象并发清理(Concurrent sweeping)清理垃圾对象这个阶段收集器线程和应用程序线程并发执行。并发重置(Concurrent reset)这个阶段重置CMS收集器的数据结构状态等待下一次垃圾回收。 低停顿的老年代垃圾回收器,通过初始标记并发标记两个阶段来实现垃圾回收。 3.2 CMS的缺点
CMS都有哪些问题
内存碎片问题。Full GC的整理阶段会造成较长时间的停顿。需要预留空间用来分配收集阶段产生的“浮动垃圾”。
由于并发标记和并发清理阶段都是并发执行所以会额外消耗CPU资源停顿时间是不可预期的。 解决老年代碎片化问题的办法
CMS在进行一定次数的Full GC标记清除的时候进行一次标记整理算法
-XX:UseCMSCompactAtFullCollection -XX:CMSFullGCBeforeCompaction5
4.G1收集器
4.1 简介
G1是JDK8 开始有在JDK9作为默认垃圾回收器。
在多处理器和大容量内存环境中。能充分利用资源尽量缩短STW。采用标记-整理算法不会产生内存碎片局部是通过复制算法把内存划分为多个独立分区Region可预测的停顿时间模型 可以自己通过参数-XX:MaxGCPauseMillis来设置允许的停顿时间(默认200ms)为每个Region记录回收的空间大小、所需时间维护一个优先级列表基于设置的停顿时间优先回收。 其他
JVM最多可以有2048个Region。一般Region大小等于堆大小除以2048比如堆大小为4096M则Region大小为2M。 G1 垃圾收集器对于对象什么时候会转移到老年代跟之前讲过的原则一样唯一不同的是对大对象的处理G1有专门分配大对象的Humongous区对G1来说超过一个Region一半大小的对象都被认为大对象将会被放入Humongous Region而对于超过整个Region的大对象则用几个连续的Humongous来存储。Full GC 的时候除了收集年轻代和老年代之外也会将Humongous区一并回收。 4.2 G1回收过程
初始标记(initial markSTW)暂停所有的线程并记录下gc roots直接能引用的对象速度很快并发标记(Concurrent Marking)和用户线程并发执行跟踪对象最终标记RemarkSTW短暂暂停用户线程重新标记因程序运行而不可达的点筛选回收CleanupSTW更新Region的统计数据对每个Region的回收价值和成本排序根据用户设置的停顿时间制定回收计划。再把需要回收的Region中存活对象复制到空的Region同时清理旧的Region。 4.3 实现可预测停顿的方式
G1收集器通过使用多线程和并发标记清除阶段来实现可预测停顿。 可预测的停顿时间模型 可以自己通过参数-XX:MaxGCPauseMillis来设置允许的停顿时间(默认200ms)为每个Region记录回收的空间大小、所需时间维护一个优先级列表基于设置的停顿时间优先回收。 44.Region的大小和结构
G1将堆划分为多个大小相等的Region每个Region的大小可以是1MB到32MB之间。Region的大小由用户在启动JVM时通过参数进行配置。
G1的堆结构由多个类型的Region组成包括
Eden Region新对象被分配到的初始区域。Survivor Region用于存储幸存的对象用于年轻代的垃圾回收。Old Region用于存储长期存活的对象和被晋升的对象。Humongous Region用于存储大对象超过了一个Region大小的对象。
G1收集器使用了多个Region之间的引用关系和各个Region之间的协作来实现高效的并发标记和回收以及垃圾回收的可预测性。 4.5 G1适合场景
50%以上的堆被存活对象占用对象分配和晋升的速度变化非常大垃圾回收时间特别长超过1秒8GB以上的堆内存(建议值)停顿时间是500ms以内 5.G1与CMS的区别
使用范围不一样 CMS是老年代的收集器可以配合新生代的Serial和ParNew收集器一起使用G1收集范围是老年代和新生代。不需要结合其他收集器使用
回收垃圾的时间 stop the world CMS以最小的停顿时间为目标的收集器。G1可预测垃圾回收的停顿时间建立可预测的停顿时间模型
垃圾碎片 CMS使用“标记-清除”算法进行的垃圾回收容易产生内存碎片G1使用的是“标记-整理”算法进行了空间整合降低了内存空间碎片。
垃圾回收的过程不一样 CMS 初始标记、并发标记、并发预清理、重新标记、并发清理、并发重置G1 : 初始标记、并发标记、最终标记、筛选回收
在大对象的处理上 CMS中若一个大对象进入S1、S2区域的时候大于改分配的区域对象会直接进入老年代G1处理大对象时会判断对象是否大于一个Region大小的50%如果大于50%就会横跨多个Region进行存放 6.G1与ZGC
ZGC JDK11 中推出的一款低延迟垃圾回收器适用于大内存低延迟服务的内存管理和回收SPECjbb 2015 基准测试在 128G 的大堆下最大停顿时间才 1.68 ms停顿时间远胜于 G1 和 CMS。与G1一样ZGC也采用基于Region的堆内存布局不一样的是ZGC的Region具有动态性动态创建销毁、动态容量大小 7.G1 提供的JVM参数配置
G1Garbage-First垃圾回收器提供了一些JVM参数配置用于调整G1垃圾回收器的行为和性能。以下是一些常用的G1相关的JVM参数配置 -XX:UseG1GC启用G1垃圾回收器。-XX:MaxGCPauseMillisn设置期望的最大垃圾回收停顿时间毫秒。G1会尽量控制垃圾回收停顿时间不超过该值。-XX:G1HeapRegionSizen设置G1堆区的区域大小。默认值为堆大小的1/2000一般不需要手动设置。-XX:ParallelGCThreadsn设置并行垃圾回收的线程数。-XX:ConcGCThreadsn设置并发标记阶段的线程数。-XX:InitiatingHeapOccupancyPercentn设置触发混合收集的堆占用百分比阈值。当堆占用达到该阈值时G1会触发混合收集。-XX:G1ReservePercentn设置G1堆区的保留空间百分比。默认值为10表示G1会保留10%的堆空间不被回收。-XX:G1HeapWastePercentn设置G1堆区的废弃空间百分比阈值。当堆区的废弃空间超过该阈值时G1会执行回收操作。-XX:G1MixedGCLiveThresholdPercentn设置混合收集过程中存活对象的阈值百分比。默认值为65表示混合收集过程中如果存活对象超过65%则会触发Full GC。 这些参数可以根据具体的应用场景和性能需求进行调整。注意在使用G1垃圾回收器时不需要手动设置很多参数因为G1会根据堆的大小和系统配置自动调整一些参数。建议在需要微调性能时再考虑调整这些参数。
附录详细介绍
1.Serial 单线程、复制算法[ -XX:UseSerialGC ]
用于新生代单线程、最基本的垃圾回收器使用复制算法只使用一个CPU或一个线程去完成垃圾收集工作并且在进行垃圾收集的同时需暂停其他所有的工作线程直到垃圾收集结束。配置参数 收集过程
使用复制算法进行回收将eden和from survivor 区活跃的对象复制到to survivor区并清空eden区和from survivor区如果to survivor区满了那么部分对象将会被晋升移动到老年代随后交换from和to区。 优缺点
单线程地好处就是减少上下文切换减少系统资源的开销。但在GC的过程中会暂停程序的执行。若GC不是频繁发生这或许是一个不错的选择否则将会影响程序的执行性能。 对于新生代来说区域比较小停顿时间短所以比较使用。 2.Serial Old单线程、标记整理算法
Serial 垃圾收集器,用于年老代的版本。单线程、最基本的垃圾回收器使用标记-压缩-清理算法 在回收阶段将标记对象越过堆的空闲区移动到堆的另一端所有被移动的对象的引用也会被更新指向新的位置。 3.ParNew Serial多线程 , 复制算法 [ -XX:UseParNewGC ]
ParNew收集器是Serial收集器的多线程版本使用复制算法完成垃圾收集默认开启的收集线程数与CPU的数量相同可使用 XX:ParallelGCThreads 参数来限制垃圾收集的线程数并行仅仅指的是收集多线程并行, ParNew 垃圾收集器在垃圾收集过程中同样也要短暂暂停所有其他的工作线程。可与CMS收集器配合工作。
4.Parallel 多线程复制算法、高效 [ -XX:UseParallelGC ]
通过多线程完成垃圾的清理工作使用复制算法完成垃圾收集占用较低的CPU因而能提高应用的吞吐 5.ParallelOld 多线程标记整理算法[ -XX:UseParallelOldGC ]
多个线程来完成使用算标记 - 整理算法JDK1.6之后才开始提供是一个老年代收集器能保证新生代的吞吐量优先无法保证整体的吞吐量 通过目标参数-XX:MaxGCPauseMills和-XX:GCTimeRatio调整新生代空间大小来降低GC触发的频率。
并行收集器适合对吞吐量要求远远高于延迟要求的场景并且在满足最差延时的情况下并行收集器将提供最佳的吞吐量。 如果系统对吞吐量要求比较高可以优先考虑新生代 Parallel Scavenge
和年老代 Parallel Old 收集器的搭配策略。 6.CMS多线程标记清除算法
针对老年代的多线程收集器实现了让垃圾收集器与用户线程近似同时工作 CMS(Concurrent Mark Sweep)收集器具有以下特点
基于标记-清除算法以获取最短回收停顿时间为目标并发收集停顿时间短。 CMS执行过程
初始标记(STW initial mark) 从垃圾回收的根对象开始只扫描到能够和根对象直接关联的对象并作标记。所以这个过程虽然暂停了整个JVM但是很快就完成了。标记GC Roots存活对象
并发标记(Concurrent marking)这个阶段紧随初始标记阶段在初始标记的基础上继续向下追溯标记。并发标记阶段应用程序的线程和并发标记的线程并发执行所以用户不会感受到停顿。对GC Roots对象引用进行追踪标记存活并发预清理(Concurrent precleaning)并发预清理阶段仍然是并发的。在这个阶段虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代 或者有一些对象被分配到老年代)。通过重新扫描减少下一个阶段重新标记的工作因为下一个阶段会Stop The World。重新标记(STW remark)这个阶段会暂停虚拟机收集器线程扫描在CMS堆中剩余的对象。扫描从跟对象开始向下追溯并处理对象关联。并发清理(Concurrent sweeping)清理垃圾对象这个阶段收集器线程和应用程序线程并发执行。并发重置(Concurrent reset)这个阶段重置CMS收集器的数据结构状态等待下一次垃圾回收。 内存碎片问题
-XX:UseCMSCoimpactAtFullCollection 默认打开在cms fgc后会STW进行碎片整理。
-XX:CMSFullGCsBeforeCompaction0 默认0多少次fgc后进行一次碎片整理0每次fgc后都整理。 concurrent mode failure 问题
CMS并发处理中年轻代移到到老年代内存不够老年代的垃圾收集器从CMS退化为Serial Old所有应用线程被暂停。
-XX:CMSInitiatingOccupancyFractionN调小并启用碎片整理 CMS 也有一些缺点其中最大的问题就是老年代内存碎片问题因为不压缩
在某些情况下 GC 会造成不可预测的暂停时间特别是堆内存较大的情况下。 7.G1 收集器
G1收集器概述
JDK1.7后全新的JVM垃圾收集器G1收集器, 目标用于取代CMS收集器。 G1收集器的最大特点
G1最大的特点是引入分区的思路弱化了分代的概念。合理利用垃圾收集各个周期的资源解决了其他收集器甚至CMS的众多缺陷。 2. G1相比较CMS的改进
算法 G1基于标记-整理算法, 不会产生空间碎片分配大对象时不会无法得到连续的空间而提前触发一次FULL GC。停顿时间可控 G1可以通过设置预期停顿时间Pause Time来控制垃圾收集时间避免应用雪崩现象。并行与并发G1能更充分的利用CPU多核环境下的硬件优势来缩短stop the world的停顿时间。 3. CMS和G1的区别
CMS中堆被分为PermGenYoungGenOldGen而YoungGen又分了两个survivo区域。在G1中堆被平均分成几个区域(region)在每个区域中虽然也保留了新老代的概念但是收集器是以整个区域为单位收集的。G1在回收内存后会马上同时做合并空闲内存的工作、而CMS默认是在STWstop the world的时候做。G1会在Young GC中使用、而CMS只能在O区使用。 4. G1收集器的应用场景
G1垃圾收集算法主要应用在多CPU大内存的服务中在满足高吞吐量的同时尽可能的满足垃圾回收时的暂停时间。
就目前而言、CMS还是默认首选的GC策略、可能在以下场景下G1更适合
服务端多核CPU、JVM内存占用较大的应用至少大于4G应用在运行过程中会产生大量内存碎片、需要经常压缩空间想要更可控、可预期的GC停顿周期防止高并发下应用雪崩现象 Garbage first 垃圾收集器是目前垃圾收集器理论发展的最前沿成果相比与 CMS 收集器G1 收
集器两个最突出的改进是
基于标记-整理算法不产生内存碎片。可以非常精确控制停顿时间在不牺牲吞吐量前提下实现低停顿垃圾回收。 G1 收集器避免全区域垃圾收集它把堆内存划分为大小固定的几个独立区域并且跟踪这些区域
的垃圾收集进度同时在后台维护一个优先级列表每次根据所允许的收集时间优先回收垃圾
最多的区域。区域划分和优先级区域回收机制确保 G1 收集器可以在有限时间获得最高的垃圾收
集效率。 JVM调优
1.什么时候需要JVM调优
应用的响应慢、CPU占用高应用吞吐量小占用内存空间过大 这些表象一般伴随着频繁的垃圾回收或者OOM。 2.JVM调优一般调什么
内存调优(堆内存元空间内存)堆栈大小避免栈溢出错误
GC调优 新生代老年代的大小比例垃圾回收器的选择
内存对象优化 避免内存泄漏及时释放不再使用的对象引用避免频繁创建和销毁对象减少垃圾回收的压力。 堆内存参数 -Xms512m 初始堆大小 默认值若未设置初始值将是老年代和年轻代分配制内存之和 -Xmx1024m 堆内存最大值。 年轻代内存相关参数 -Xmn512m 新生代的初始值及最大值。 默认值堆内存的1/4已经分配的堆内存的1/4。 -XX:NewSize512m 设置新生代的初始值。 -XX:MaxNewSize512m 设置新生代的最大值。 -XX:NewRatio8 老年代和年轻代的比例。 比如-XX:NewRatio8 表示:老年代内存:年轻代内存8:1 -XX:SurvivorRatio8 新生代和存活区的比例 -XX:SurvivorRatio8 表示存活区新生代18 》新生代占年轻代的8/10,每个存活区各占年轻代的1/10 元空间参数 -XX:MetaspaceSize 初始元空间大小 达到该值就会触发垃圾收集进行类型卸载 -XX:MaxMetaspaceSize256m 设置元空间的最大值默认是没有上限的也就是说你的系统内存上限是多少它就是多少。 3.JVM调优回答
一般 应用的响应慢、CPU占用高gc次数高发生了OOM排除是代码问题后是需要调优了。 1.如果是原生内存不足可以通过 jmap -heap pid 查看 jvm 内存分配 1.定位需要调优的位置首先定位内存占用在那里是否是内存泄漏
有GC日志可通过GC日志查看内存回收情况。有内存快照可通过工具例如MatJVisualVM 导入快照查看内存占用高的对象。没有内存快照可通过jmap手动生成内存快照。 2.定位到问题后针对问题调整参数
比如堆的大小新生代老生代的比例减少fulklgc
3.JVM调优基本步骤
首先在启动程序的时候
3.1添加GC日志相关的参数
-XX:PrintGC输出GC日志
-XX:PrintGCDetails输出GC的详细日志
-XX:PrintGCTimeStamps输出GC的时间戳以基准时间的形式
-XX:PrintGCDateStamps输出GC的时间戳以日期的形式如2018-08-29T19:22:48.741-0800
-XX:PrintHeapAtGC在进行GC的前后打印出堆的信息
-Xloggc:gc.log日志文件的输出路径
3.2添加内存溢出与Full gc前快照输出参数
-XX:HeapDumpOnOutOfMemoryError 发生内存溢出时生成heapdump文件
-XX:HeapDumpBeforeFullGC 发生Full gc前生成heapdump文件
-XX:HeapDumpPath指定heapdump输出路径 3.3通过日志确定问题
3.3.1堆内存不足
排查是否是设置的堆内存过小还是内存溢出情况。拿到当时的内存快照用工具分析 jump用Mat工具分析。 3.3.2频繁Full gc
考虑是否是新上线的代码问题有大对象占用导致了频繁YGC进而导致了晋升至年老代的对象增多老年代达到内存阈值触发 Full gc ;考虑是否是新生代设置太小 总结
若是代码问题可通过版本控制工具找到本期变更的代码优化代码
若非代码问题可适当增加堆内存大小、新生代老年代的大小与比例 , 适当增大新生代内存大小。 4.监控工具
4.1使用jstat 统计gc相关信息
jstat 是 jdk bin 下自带工具最多的是用来统计gc相关信息使用步骤如下。
获取进程号 ps -ef|grep 对应进程例如我想统计jvm-demo.jar进程号27164的gc信息并且每隔3秒统计一次可以执行以下命令
jstat -gcutil 27164 3000 主要关注以下几个。
s0、s1:表示两个survior区域的使用百分比eeden区域使用百分比o老年代使用百分比mmetaspace元数据空间使用百分比ygc新生代gc次数ygct新生代gc累计总时间fgcfull gc次数fgctfull gc累计总时间gctgc累计总时间 若要进一步查看上一次GC信息
jstat -gccause 27146 3000 LGCC上一次gc的原因Allocation Failure是新生代满了进行gcgcc当前gc的原因如果当前没有gc就no gc 4.2使用jmap命令查某时刻的JVM堆信息
使用步骤
获取进行 pid ps -ef|grep 对应进程例如我想统计jvm-demo.jar进程号27164的信息并且每隔3秒统计一次可以执行以下命令 jmap -heap 2865 输出内容示例
Attaching to process ID 27146, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01using thread-local object allocation.
Mark Sweep Compact GC#堆相关的配置信息
Heap Configuration:MinHeapFreeRatio 40MaxHeapFreeRatio 70MaxHeapSize 104857600 (100.0MB)NewSize 10485760 (10.0MB)MaxNewSize 34930688 (33.3125MB)OldSize 20971520 (20.0MB)NewRatio 2SurvivorRatio 8MetaspaceSize 21807104 (20.796875MB)CompressedClassSpaceSize 1073741824 (1024.0MB)MaxMetaspaceSize 17592186044415 MBG1HeapRegionSize 0 (0.0MB)#堆占用相关的配置信息
Heap Usage:
New Generation (Eden 1 Survivor Space):capacity 12517376 (11.9375MB)used 10708296 (10.212226867675781MB)free 1809080 (1.7252731323242188MB)85.54745020042539% used
Eden Space:capacity 11141120 (10.625MB)used 10708272 (10.212203979492188MB)free 432848 (0.4127960205078125MB)96.11486098345588% used
From Space:capacity 1376256 (1.3125MB)used 24 (2.288818359375E-5MB)free 1376232 (1.3124771118164062MB)0.0017438616071428572% used
To Space:capacity 1376256 (1.3125MB)used 0 (0.0MB)free 1376256 (1.3125MB)0.0% used
tenured generation:capacity 27684864 (26.40234375MB)used 27096504 (25.84123992919922MB)free 588360 (0.5611038208007812MB)97.87479541167332% used15431 interned Strings occupying 2044328 bytes. 5.常用的调优工具有哪些
JDK内置的命令行jps查看jvm进程信息、jstat监视jvm运行状态的比如gc情况、jvm内存情况、类加载情况等、jinfo查看jvm参数的也可动态调整、jmap生成dump文件的在dump的时候会影响线上服务、jhat分析dump的但是一般都将dump导出放到mat上分析、jstack查看线程的。 JDK内置的可视化界面JConsole、JVisualVM这两个在QA环境压测的时候很有用。 阿里巴巴开源的arthas神器线上调优很方便安装和显示效果都很友好 可以查看层级关系的工具
ibm的was服务器产生的dump文件要用他特有的jar包才可以看。
使用ha456.jar 查看dump文件。
java –Xmx5g -jar ha456.jar
链接:百度网盘 请输入提取码 密码:5vp4
6.手动打Dump
jmap -dump:formatb,file文件名 [pid]^C 常见参数配置
类加载设置
-XX:TraceClassLoading:类加载日志
-XX:TraceClassUnloading:类卸载日志 堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSizen:设置年轻代大小
-XX:NewRation:设置年轻代和年老代的比值。如:为3表示年轻代与年老代比值为13年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRation:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如3表示EdenSurvivor32一个Survivor区占整个年轻代的1/5
-XX:MaxPermSizen:设置持久代大小 收集器设置
-XX:UseSerialGC:设置串行收集器
-XX:UseParallelGC:设置并行收集器
-XX:UseParalledlOldGC:设置并行年老代收集
-XX:UseConcMarkSweepGC:设置并发收集器 垃圾回收统计信息
-XX:PrintGC
-XX:PrintGCDetails
-XX:PrintGCTimeStamps
-Xloggc:filename 并行收集器设置
-XX:ParallelGCThreadsn:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillisn:设置并行收集最大暂停时间
-XX:GCTimeRation:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1n) 并发收集器设置
-XX:CMSIncrementalMode:设置为增量模式。适用于单CPU情况
-XX:ParallelGCThreadsn:设置并发收集器年轻代收集方式为并行收集时使用的CPU数。并行收集线程数。 分类 参数 说明 标准参数 -server jvm使用server模式,默认该模式特点启动慢、运行性能和内存管理效率很高适用生产环境。 -client jvm使用client模式特点启动快、运行性能和内存管理效率不高适用开发调试。 -Dpropertyvalue 设置系统属性可用System.getProperty(“property”)获取如果value中有空格则需要用双引号将该值括起来如-Dname”space string”该参数通常用于设置系统级全局变量值 -verbose:gc 表示输出虚拟机中GC的详细情况 堆内存 -Xms2g jvm内存(堆内存)启动初始值 默认是物理内存的1/64 -Xmx3g jvm内存(堆内存)最大值 默认是物理内存的1/4 -Xmn1g 年轻代大小 栈内存 -Xss1m 每个线程java虚拟机栈大小 -Xoss128k 本地方法栈大小 HotSpot不区分虚拟机栈和本地方法栈该参数无效 内存分配 -XX:PermSize48m 设置永久代初始大小 默认20.75M -XX:MaxPermSize128m 设置永久代最大可分配空间 32位机器默认64M 64位机器默认82M -XX:NewRatio4 表示设置年轻代包括Eden和两个Survivor区/老年代 的大小比值为14这意味着年轻代占整个堆的1/5 -XX:SurvivorRatio8 表示设置2个Survivor区1个Eden区的大小比值为2:8这意味着Survivor区占整个年轻代的1/5这个参数默认为8 进入老年代 -XX:PretenureSizeThreshold3145728 表示对象大于31457283M时直接进入老年代分配这里只能以字节作为单位 -XX:MaxTenuringThreshold1 表示对象年龄大于1自动进入老年代,如果设置为0的话则年轻代对象不经过Survivor区直接进入年老代。对于年老代比较多的应用可以提高效率。如果将此值设置为一个较大值则年轻代对象会在Survivor区进行多次复制这样可以增加对象在年轻代的存活时间增加在年轻代被回收的概率。最大15 -XX:TargetSurvivorRatio 默认50动态年龄判断 年龄1、2...n累计到达S区50%年龄n及以上进入老年代 参数配置 -Xloggc:filePath 配置gc日志路径 -XX:PrintGCDetails 打印详细的gc日志 -XX:PrintGCTimeStamps 打印gc发生的时间 -XX:TraceClassLoading 表示查看类的加载信息 -XX:TraceClassUnLoading 表示查看类的卸载信息 -XX:HeapDumpOnOutOfMemoryError 表示可以让虚拟机在出现内存溢出异常时Dump出当前的堆内存转储快照 -XX:HeapDumpPath 内存溢出异常时Dump出堆内存快照路径 -XX:CompileThreshold1000 表示一个方法被调用1000次之后会被认为是热点代码并触发即时编译 -XX:PrintHeapAtGC 表示可以看到每次GC前后堆内存布局 -XX:PrintTLAB 表示可以看到TLAB的使用情况 -XX:UseSpining 开启自旋锁 -XX:PreBlockSpin 更改自旋锁的自旋次数使用这个参数必须先开启自旋锁 -XX:DisableExplicitGC 禁止显示执行GC,即禁止代码触发GC(System.gc();) 调优参数 -XX:ExplicitGCInvokesConcurrent 命令JVM无论什么时候调用系统GC都执行CMS GC而不是Full GC。 -XX:ParallelRefProcEnabled 并行处理Reference加快处理速度缩短耗时 -XX:UseCMSCompactAtFullCollection full gc压缩 默认true开启 -XX:CMSFullGCsBeforeCompaction 多少次full gc做压缩默认0每次full gc后压缩碎片 -XX:CMSInitiatingOccupancyFraction92 是指设定CMS在对内存占用率达到92%的时候开始GC(因为CMS会有浮动垃圾,所以一般都较早启动GC) -XX:UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值(上面指定的92%),如果不指定,JVM仅在第一次使用设定值,后续则自动调整. -XX:CMSScavengeBeforeRemark 在CMS GC重新标记前启动一次ygc目的在于减少old gen对ygc gen的引用降低remark时的开销(一般CMS的GC耗时 80%都在remark阶段) -XX:CMSParallelInitialMarkEnabled 在CMS垃圾回收器的“初始标记”阶段开启多线程并发执行 垃圾回收器 -XX:UseG1GC 表示让JVM使用G1垃圾收集器 -XX:UseSerialGC 表示使用jvm的串行垃圾回收机制该机制适用于单核cpu的环境下 -XX:UseParallelGC 表示使用jvm的并行垃圾回收机制该机制适合用于多cpu机制同时对响应时间无强硬要求的环境下使用-XX:ParallelGCThreads设置并行垃圾回收的线程数此值可以设置与机器处理器数量相等。 -XX:UseParallelOldGC 表示年老代使用并行的垃圾回收机制 -XX:UseConcMarkSweepGC 表示使用并发模式的垃圾回收机制该模式适用于对响应时间要求高具有多cpu的环境下 G1参数 -XX:MaxGCPauseMillis100 设置每次年轻代垃圾回收的最长时间如果无法满足此时间JVM会自动调整年轻代大小以满足此值。 -XX:UseAdaptiveSizePolicy 设置此选项后并行收集器会自动选择年轻代区大小和相应的Survivor区比例以达到目标系统规定的最低响应时间或者收集频率等此值建议使用并行收集器时一直打开 -XX:G1HeapRegionSize 指定Region大小必须是2的倍数1M、2M、4M到32M。一般自己计算即可 -XX:G1NewSizePercent 新生代初始内存默认为堆内存的5% -XX:G1MaxNewSizePercent 新生代最高内存默认为堆内存的60% -XX:InitiatingHeapOccupancyPercent 到达老年代占据堆内存的百分比时会触发新生代和老年代的混合垃圾回收默认45% -XX:G1MixedGCCountTarget 多次混合回收默认8次 -XX:G1HeapWastePercent 停止结束混合回收条件堆内存有5%空闲Region 默认5 -XX:G1MixedGCLiveThresholdPercent 每个Region空间存活对象低于85%时才会回收默认85 Metaspace -XX:MetaspaceSize 是分配给类元数据空间以字节计的初始大小(Oracle逻辑存储上的初始高水位the initial high-water-mark )此值为估计值。MetaspaceSize的值设置的过大会延长垃圾回收时间。垃圾回收过后引起下一次垃圾回收的类元数据空间的大小可能会变大。 -XX:MaxMetaspaceSize 是分配给类元数据空间的最大值超过此值就会触发Full GC此值默认没有限制但应取决于系统内存的大小。JVM会动态地改变此值。 -XX:MinMetaspaceFreeRatio 表示一次GC以后为了避免增加元数据空间的大小空闲的类元数据的容量的最小比例不够就会导致垃圾回收。 -XX:MaxMetaspaceFreeRatio 表示一次GC以后为了避免增加元数据空间的大小空闲的类元数据的容量的最大比例不够就会导致垃圾回收。