
JVM
霁云HYY
博客中的很多内容都是取自公众号《儒猿技术窝》中的专栏,进行了一定的修改和总结,感兴趣的同学可以自行查找更加具体的专栏参考和学习
展开
-
Java内存模型
计算机的存储设备和CPU的运算速度相差了几个数量级,为了提升工作效率,计算机都加入了一层高速缓存(Cache)来作为内存与CPU之间的缓冲。这样计算时,CPU就能从Cache中获取数据快速计算,而内存也可以从Cache上获得CPU计算的结果。加入了一层缓存之后,比然会带来缓存一致性问题。为了解决这个问题,需要各个处理器在访问缓存时都遵循一些协议,在读写时根据协议进行操作。“内存模型”就可以理解为...原创 2019-12-27 17:56:43 · 189 阅读 · 0 评论 -
JVM常用参数设置
-Xms4096M :初始堆大小-Xmx4096M :最大堆大小-Xmn3072M :年轻代大小-Xss1M :每个线程的堆栈大小-XX:MetaspaceSize=256M :元空间大小-XX:MaxMetaspaceSize=256M :最大元空间大小-XX:+UseParNewGC :年轻代使用ParNew垃圾收集器-XX:+UseConcMarkSweepGC :老年代使用...原创 2019-10-24 20:54:22 · 520 阅读 · 0 评论 -
JVM中的OOM内存溢出
JVM中的主要内存区域包括了以下几种:元空间这一块区域在JDK1.7之前叫做方法区,在JDK1.8之后改成了元空间(Metaspace),这一块内存区域主要是存放了从“.class”文件里加载进来的类,还会有一些类似常量池的东西放在这个区域里。程序计数器程序计数器就是用来记录当前执行的字节码指令的位置的,也就是记录目前执行到了哪一条字节码指令。Java虚拟机栈Java虚拟机...原创 2019-10-13 21:41:02 · 315 阅读 · 0 评论 -
CMS垃圾收集器原理
一般我们老年代的垃圾收集器都是使用的CMS(Concurrent Mark Sweep)。CMS使用的是标记-清理算法,工作流程大致是先标记需要回收的对象,然后回收垃圾,最后将存活的对象整理到一边,防止出现太多的内存碎片。有人说这不就是标记-整理算法吗,但是标记整理算法的步骤是先标记需要回收的对象,然后将存活的对象整理到一边,最后才将端边界之外的可回收对象清理。因为在垃圾收集的时候,必然会产生“...原创 2019-09-07 11:39:27 · 523 阅读 · 0 评论 -
CMS垃圾回收器存在的问题及解决方案
之前的文章介绍过了CMS垃圾回收器的工作原理,CMS是使用标记-清理算法去垃圾回收的。其中四个主要的流程分别是初始标记、并发标记、重新标记、并发清理。并发消耗CPU资源其中的并发标记和并发清理是工作线程和垃圾回收线程并发工作,这样在需要STW的时间内不会让整个系统不可用。但是在并发标记阶段,需要根据GC Roots标记出大量的存活对象,而在并发清理阶段,则需要垃圾对象从各种随机内存位置删掉...原创 2019-09-09 21:10:03 · 2902 阅读 · 0 评论 -
G1垃圾回收器原理
现在一般的垃圾回收器都是选择ParaNew+CMS的搭配,使用多线程并发回收可以有效降低STW(stop the world)时间,但是在一些响应时间比较短的场景下,STW的时间不可控就会造成一些影响,还有就是系统的机器内存很大的情况下,可能一次回收会有很多个G的垃圾需要回收,那么必然会导致垃圾回收时间较长。在这种情况下,就需要使用G1垃圾回收器,G1可以同时完成年轻代和老年代的回收,且可以指定我...原创 2019-09-15 17:19:28 · 1275 阅读 · 0 评论 -
G1混合回收及一些参数的设置
G1在什么时候会触发新生代和老年代的混合GC呢,有一个参数可以控制,就是 -XX:InitiatingHeapOccupancyPercent,默认值是45,也就是老年代占据了堆内存45%的Region的时候。混合回收的步骤有点类似于CMS垃圾回收器的回收步骤,具体步骤如下:初始标记这个阶段需要STW(Stop the World),会停止所有的工作线程,然后标记所有GC Roots直接...原创 2019-09-21 17:11:44 · 2525 阅读 · 2 评论