jvm
文章平均质量分 62
快乐的码农一枚
这个作者很懒,什么都没留下…
展开
-
一个应用使用本地缓存导致YoungGC变长
本地缓存使用过多,会导致缓存集合里面的数据变多,这样会导致扫描时间变长; 缓存又是一个经常变换的,就更加加剧了gc扫描的时间 static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next;} 如果对象有hash冲突的时候,采用链表存储。这样会导致有部分缓存对象进入老年代之后,nex原创 2020-06-24 17:49:38 · 562 阅读 · 0 评论 -
jvm调优的一些见解
如果新生代在自动适配的时候比较小,导致对象很快进入老年代,FullGC会变长;可以设置NewSize大小,直接设置了最小的新生代大小,避免这种情况 如果gc时间长的时候,可以增加并行任务核数,来提高并行速度;还可以增加并发的数量,但是不能太大,以免影响正常的线程运行(Gc线程和业务线程是并发运行的) GC收集器的选择,如果追求吞吐量则选择CMS或者ParallelGc, 设置GCTimeRatio来提高吞吐量; 如果是追...原创 2020-06-22 18:35:52 · 181 阅读 · 0 评论 -
-XX:+AlwaysPreTouch
作用 服务启动的时候真实的分配物理内存给jvm如果没有此参数,则jvm启动的时候,分配的只是虚拟内存,当真正使用的时候才会分配物理内存如果没有此参数,则代码运行的时候,实时分配物理内存,导致代码运行速度变慢如果有此参数,则jvm启动的时候速度会下降很多...原创 2020-06-11 14:05:40 · 3703 阅读 · 0 评论 -
Young GC越来越耗时
前提:服务用的是CMS垃圾收集器 现象 :当每次CMS GC后 YoungGc会变正常,但是后面越来越慢 可能的原因 (1)StringTable太大 (2)存在老生代到新生代的引用 对于第一种情况定位 83245.952: [GC (CMS Initial Mark) [1 CMS-initial-mark: 1619782K(2023424K)] 1686491K(2722496K), 0.0077340 secs] [Times: user=0.03 sys=0.0...原创 2020-06-10 14:44:19 · 1056 阅读 · 0 评论 -
java对象创建锁在区域优先级
栈上分配 1、Thread Local Allocation Buffer 判断是否是大对象,如果不是则在Eden区域分配 大对象,直接在老年代分配原创 2020-06-04 17:29:44 · 213 阅读 · 0 评论 -
FGC频繁
1、假如FGC次数增加,达到一小时一次,但是gc之后,内存也立马降下来了;这说明并没有发生内存泄露;只是新生代的对象过早的进入的老年代;解决办法有增加年轻代空间,以减少youngGc,这样就不会有对象过早的进入老年代 增加年轻代进入老年代的年代阀值,可以增加到最大的15次...原创 2020-06-01 15:27:52 · 622 阅读 · 0 评论 -
G1垃圾回收器步骤
4443.554: [GC pause (G1 Evacuation Pause) (young), 0.0061966 secs] [Parallel Time: 4.2 ms, GC Workers: 8] [GC Worker Start (ms): Min: 4443554.1, Avg: 4443554.2, Max: 4443554.2, Diff: 0.1] [Ext Root Scanning (ms): Min: 1.1, Avg: 1.2, Max: 1..原创 2020-05-22 18:51:51 · 970 阅读 · 0 评论 -
CMS GC的步骤
初始化标记---》 1. 标记老年代中所有的GC Roots对象,如下图节点1;2. 标记年轻代中活着的对象引用到的老年代的对象 并发标记 1、从“初始标记”阶段标记的对象开始找出所有存活的对象;2、并发标记阶段只负责将引用发生改变的Card标记为Dirty状态,不负责处理 预清理阶段 用来处理前一个阶段因为引用关系改变导致没有标记到的存活对象的,它会扫描所有标记为Direty的Card 可终止的预处理 这个阶段尝试着去...原创 2020-05-22 15:34:05 · 960 阅读 · 0 评论 -
java完全把内存回收的权限给了虚拟机
为啥不能半自动化垃圾回收DirectByteBuffer 的内存回收机制,采用了启动线程自己控制回收内存,而非垃圾回收器绝对决定怎么去回收,程序无法感知堆内内存,怎么做到半控制回收内存?这样可以减少youngGc的时长,因为现在的内存越来越大,太大的时候回收垃圾时长会越来越长分代回收策略也是要回收所有的新生代,如果新生代越大就会回收越来越慢...原创 2020-05-21 14:26:07 · 79 阅读 · 0 评论 -
JVM youngGc FullGc的触发条件
youngGc触发条件大多数情况下,对象直接在年轻代中的Eden区进行分配,如果Eden区域没有足够的空间,那么就会触发YGC(Minor GC)进入老年代的途径 YGC时,To Survivor区不足以存放存活的对象,对象会直接进入到老年代。 经过多次YGC后,如果存活对象的年龄达到了设定阈值,则会晋升到老年代中。 动态年龄判定规则,To Survivor区中相同年龄的对象,如果其大小之和占到了 To Survivor区一半以上的空间,那么大于此年龄的对象会直接进入老年代,而不原创 2020-05-21 11:40:19 · 4498 阅读 · 0 评论 -
young gc时间缩减
young gc的耗时主要有两个方面从root对象进行扫描存活的对象 复制存活的对象从缩短扫描存活对象的方面入手:首先我们先考虑root对象包含哪些1、所有java线程以及线程栈帧里指向GC堆里的对象的引用2、JNI Local & Global3、由系统类加载器(system class loader)加载的对象,这些类是不能够被回收的4、stack local Java方法的local变量或参数5、其他,包含monitor & finalizable & n原创 2020-05-14 14:35:28 · 647 阅读 · 0 评论 -
jvm优化
###查看JVM参数默认值java-XX:+PrintFlagsInitial-version|grep"MetaspaceSize"java-XX:+PringCommandLineFlags-version###订单风控-XX:+UseG1GC-Xmx2g-XX:MaxGCPauseMillis=1000-XX:MetaspaceSize=45m-XX:G1...原创 2020-05-07 18:29:03 · 160 阅读 · 0 评论 -
G1的gc日志
44.402: [GC pause (G1 Evacuation Pause) (young) (initial-mark), 0.0040475 secs] [Parallel Time: 3.3 ms, GC Workers: 8] [GC Worker Start (ms): Min: 44402.4, Avg: 44403.7, Max: 44404.4, Diff: ...原创 2020-04-26 16:52:44 · 464 阅读 · 0 评论 -
一般线上jvm配置,以及配置说明
JAVA_MEM_OPTS=" -server -XX:+UseG1GC -Xmx2G -XX:MaxGCPauseMillis=10 -XX:+UnlockExperimentalVMOptions -XX:G1NewSizePercent=15 -XX:G1MaxNewSizePercent=30 -XX:SurvivorRatio=6 -XX:InitiatingHeapOccupancyP...原创 2020-04-26 14:46:00 · 1423 阅读 · 0 评论 -
JVM调优的小优化
大对象需要在老年代进行分配,通过参数-XX:PetenureSizeThreshold 单位B 。如果在年轻代分配大对象,则很快年轻代就会满,一些年轻代对象提早进入了老年代,进而导致老年代拥挤,触发FullGc 设置年轻代的存活年龄阀值,通过参数XX:MaxTenuringThreshold 可以让年轻代对象在 年轻代就进行回收,避免进入老年代导致频繁的FullGc -Xms -Xmx...原创 2020-03-19 14:45:09 · 109 阅读 · 0 评论 -
CMS 的一些问题
无法处理浮动垃圾;可能出现 “Concurrnet Mode Failure” 失败而导致另一次 Full GC 的产生,可能引发串行 Full GC 空间碎片,导致无法分配大对象,CMS 收集器提供了一个 -XX:+UseCMSCompactAtFullCollection 开关参数(默认就是开启的),用于在 CMS 收集器顶不住要进行 Full GC 时开启内存碎片的合并整理过程,内存整理的...原创 2020-01-20 17:38:03 · 410 阅读 · 0 评论 -
JVM的一些琐事
Full GC触发条件System.gc() 老年代空间不足 空间分配担保失败原创 2020-01-19 17:20:21 · 80 阅读 · 0 评论 -
cms remark 时长比较长的优化
原因:remark是stop the world 阶段;当之前concurrent-mark完成后,此时jvm的申请的内存比较频繁,年轻代突然涨起来了remark需要重新扫描年轻代,查询是否有引用老年代的指针;如果年轻代比较大,导致扫描时长比较长;重新标记的内存范围是整个堆,包含younggen和oldgen如果被新生代中的对象引用,那么就会被视为存活对象,即使新生代的对象已经不可达了,也...原创 2020-01-16 18:39:16 · 1470 阅读 · 0 评论 -
强引用和弱引用jvm回收区别
强引用回收的步骤 1、判断是否有必要执行finalize方法 下面两种情况没有必要执行了 a)对象没有重写finalize方法 b)finalize方法已经被虚拟机调用过了2、如果上述条件判断出,是需要执行finalize方法的;那么此对象将会放置在一个叫做 F-Queue的队列中,并由虚拟机自建的Finalizer线程去执行它(此线程低优先级)3、是被回收还是逃...原创 2020-01-15 13:04:41 · 362 阅读 · 0 评论 -
JVM 调优 一些原则
GC优化的两个目的: 1) 将进入老年代的对象数量降到最低 基本都是分代GC,就是对象在Eden区被创建,随后被转移到Survivor区,在此之后剩余的对象会被转入老年代。也有一些对象由于占用内存过大,在Eden区被创建后会直接被传入老年代。老年代GC相对来说会比新生代GC更耗时,因此,减少进入老年代的对象数量可以显著降低Full GC的频率。你可能会以为减少进入老年代的...原创 2020-01-15 10:44:41 · 490 阅读 · 0 评论 -
JVM 调优 ----- G1
2020-01-09T20:53:25.970+0800: 899.957: [Full GC (Allocation Failure) 2048M->355M(1192M), 0.8310098 secs] [Eden: 0.0B(816.0M)->0.0B(472.0M) Survivors: 0.0B->0.0B Heap: 2048.0M(2048.0M)-...原创 2020-01-14 11:41:02 · 1069 阅读 · 0 评论 -
JVM面试题目
JVM的结构 新生代和老年代的垃圾回收算法 虚拟机栈和本地方法栈的区别 类信息会加载到JVM哪个区域 JVM中什么时候会进行垃圾回收?什么样的对象是可以回收的? 说一下Java垃圾回收机制 Java虚拟机内存模型能说说吗? 类加载器的双亲委派模型是什么? JVM垃圾收集算法与收集器有哪些? JVM诊断调优工具用过哪些? 每秒几十万并发的秒杀系统为什么会频繁发生GC? 日均百万...原创 2020-01-02 21:44:34 · 89 阅读 · 0 评论 -
JVM工具
jps-v展示启动参数,进程IDjinfo[选项]pid 虚拟机的一些参数、配置 java.runtime.name = Java(TM) SE Runtime Environmentjava.vm.version = 25.65-b01sun.boot.library.path = /opt/jdk1.8.0_65/jre/lib/amd64java.protoc...原创 2020-01-08 18:15:46 · 990 阅读 · 0 评论 -
JVM优化
优化的问题1、如果YGC 随着时间的推移,耗时越来越大 先学习一下YGC经历哪些步骤,哪些步骤会比较耗时 步骤1 查找GC-ROOT对象,copy到to区域 步骤2、递归步骤1,查找GC-ROOT引用的对象,copy到to区域GC-ROOT包含的 Universe类中所引用...原创 2019-12-25 17:17:57 · 414 阅读 · 0 评论