本篇内容主要讲解“有哪些学习Java GC的基础”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“有哪些学习Java GC的基础”吧!浅谈基础1.1 运行时数据区(Java 1.8)1.2 垃圾收集算法1.3 垃圾收集器解析 GC 日志JVM 监控工具Linux 监控相关(Program Counter Register)【线程隔离】可简单理解为当前线程所执行的字节码行号指示器;如果是java方法,计数器记录指向虚拟机字节码指令地址;如果是native方法,计数器值为undefined;【异常相关】唯一一个没规定OOM的区域。(VM Stack)【线程隔离】其描述的是Java方法执行的内存模型:【重点】每个方法执行的过程都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。方法调用到执行结束,对应着一个栈帧在虚拟机栈中入栈到出栈的过程;【异常相关】如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。方法每次调用都会创建一个栈帧,然后栈帧压栈,总不能无限压栈吧(初看没看懂,搜了下,发现也有人没看懂,心里平衡点);【异常相关】大部分虚拟机栈都可以动态扩展,如果扩展时无法申请到足够的内存,就会OOM。代码示例,见文末 code01.StackOverflowError(Native Method Stack)【线程隔离】与虚拟机栈的区别是,虚拟机栈执行java方法(字节码)服务 香港云主机;本非方法栈则为native方法服务;【异常相关】StackOverflowError、OOM。(Heap)【线程共享】GC堆(垃圾堆),是垃圾收集器管理的主要区域;java1.8之后【年轻代、老年代】。代码示例,见文末 code02.OOM-heap(Metaspace)【线程共享】jvm config example: -XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=50m
元数据区取代了永久代,本质上都是方法区的实现,用来存放虚拟机加载的类信息、常量、静态变量、JIT编译后的代码。代码示例,见文末 code03.OOM-metaspace对象在否?引用计数算法、可达性分析算法标记-清除算法(先标记,再清除,清除后空间不连续,产生大量内存碎片)复制算法年轻代:Eden : Survivor = 1:8,会有10%的内存“闲置”;每次GC后,存活的对象都会放在剩余的10%内存中,也就是To Survivor;当然,如果剩余的10%内存不够用呢,就需要依赖老年代进行分配担保。标记-整理算法如果对象存活率较高,那么复制算法就不好用了;标记-清除算法之后,将所有存活的对象都向一端移动,然后清理掉边界以外的内存。分代收集算法典型就是分为新生代和老年代新生代,存活率低,就使用复制算法老年代,存活率高,并且没有额外的空间做担保,所以使用“标记-清除”或者“标记-整理”算法【单线程】历史悠久,新生代收集器,复制算法;GC时要STW,直到GC完成(你妈妈在打扫卫生,你一边乱扔纸屑,所以必须STW,你得老老实实坐着);Client 模式下默认的新生代收集器(与其他单线程收集器相比,简单高效)。【并行多线程】新生代收集器,复制算法,Serial收集器的多线程版本;单CPU下,不会比Serial好;甚至双CPU都不能100%超越Serial;Server模式下首选新生代收集器,重要原因是,他能和CMS(真正意义上的并发收集器)配合工作。【Throughput】吞吐量优先【并行多线程】新生代收集器,复制算法;关注点不一样,目标为可控的吞吐量(Throughput),其他的关注点是尽可能缩短GC STW时间;吞吐量 = 运行用户代码时间 / (运行用户代码时间 + GC时间)【单线程】老年代收集器,标记 – 整理算法;主要用户Client 模式下虚拟机;Server模式下,1. JDK1.6以前与PS搭配使用;2. CMC收集器后背预案。【Throughput】吞吐量优先【并行多线程】老年代收集器,标记 – 整理算法;jdk1.6以前,如果选了PS,就不能选CMS了,只能选Serial Old;吞吐量优先第一组合。【并发多线程】老年代收集器,基于标记 – 清除(初始 & 并发 & 重新 标记,并发清除);关注点不一样,目标为可控的吞吐量(Throughput),其他的关注点是尽可能缩短GC STW时间;并发低停顿;缺点:CPU资源非常敏感、无法处理浮动垃圾、基于标记清除多碎片。有点多,暂缓。。。147.981
和 148.011
: JVM启动以来经过的秒数GC
和 Full GC
: 表示垃圾收集停顿类型。注意:不是用来区分新生代还是老年代的GC (Allocation Failure)
Allocation Failure 指分配失败,也即空间不足;Full GC (Ergonomics)
Ergonomics 可以理解为自适应,表示自动的调节STW时间和吞吐量之间的平衡;Full GC (System)
调用 System.gc()
触发的GC。[PSYoungGen: 150496K->5938K(147456K)]
PSYoungGen,PS表示Parallel Scavenge收集器DefNew(Default New Generation),也即使用Serial收集器[ParOldGen: 51610K->48605K(83968K)]
ParOldGen,ParOld表示Parallel Old收集器,吞吐量优先[XXXXXX: 150496K->5938K(147456K)]
150496K->5938K(147456K)
GC前该内存区域已使用容量 -> GC后该内存区域已使用容量(该内存区域总容量)198958K->57548K(202752K)
GC前Java堆已使用容量 -> GC后Java堆已使用容量(Java堆总容量)0.0304547 secs
GC耗时合计(secs秒)[Times: user=0.05 sys=0.00, real=0.03 secs]
用户态CPU耗时、内核态CPU耗时和墙钟时间CPU时间与墙钟时间区别:墙钟时间包括各种非运算等待耗时,例如等待磁盘、线程阻塞;当多CPU或者多核的话,多线程会叠加这些CPU时间,所以user或sys超过real是完全正常的。到此,相信大家对“有哪些学习Java GC的基础”有了更深的了解,不妨来实际操作一番吧!这里是开发云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
这篇文章主要介绍“SpringAOP的介绍和使用方法”,在日常操作中,相信很多人在SpringAOP的介绍和使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringAOP的介绍和使用方法”的疑惑有所帮助!接下来,请跟着…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。