java
文章平均质量分 91
你想要怎样的未来
一名前进中的 javaer
展开
-
JVM——17.系统上线的JVM配置步骤
文章目录1. 预评估阶段2. JVM 参数模板3. 压力测试4. 上线后的监控1. 预评估阶段对于一个新系统面临上线,需要设置线上的jvm参数,最严谨的方法当然是:评估系统中各个接口的一次请求大概会产生多少M的对象;评估系统一秒大概会接收到多少个请求,这些请求分布在哪些接口,一共会产生多少M的对象;根据每秒生成的对象大小,估计新生代需要给多少的内存,YGC发生的频率,进入老年代的频率;再估计老年代应该给多少的内存,FGC发生的频率等;最终得到需要选择什么样配置的机器,和大概的JVM配置参数;原创 2021-11-18 23:45:22 · 1040 阅读 · 1 评论 -
JVM——16.Full GC 相关总结
文章目录1. 对象进入老年代的情况2. 触发 Full GC 的情况3. 频繁 Full GC 的情况4. 如何定位及解决频繁 Full GC1. 对象进入老年代的情况分配担保规则:新生代GC过后,存活对象太多,Survivor区放不下了,这个时候就需要通过分配担保进入老年代;达到年龄阈值:对象在新生代熬过了15次(-XX:MaxTenuringThreshold)GC,达到了年龄阈值,会晋升到老年代;(这种对象一般很少,只有在系统中的确需要长期存在的核心组件等,它们一般不能被回收)动态年龄判断:原创 2021-11-18 23:39:23 · 980 阅读 · 0 评论 -
JVM——15.定位 堆外内存 OOM
文章目录1. ByteBuffer 堆外内存介绍2. ByteBuffer 堆外内存申请、释放(源码分析)2.1 堆外内存申请2.2 堆外内存释放3. 什么情况会发生 堆外内存 OOM4. 模拟 堆外内存 OOM4.1 模拟14.2 模拟24.3 模拟35. 堆外内存 OOM 的定位及解决1. ByteBuffer 堆外内存介绍在介绍OOM那篇文章中,对堆外内存进行了介绍,就直接把它复制过来;ByteBuffer和DirectByteBuffer:ByteBuffer:字节缓冲区,它有两种实现:原创 2021-11-04 23:42:36 · 1185 阅读 · 0 评论 -
JVM——14.定位 Heap OOM
文章目录1. JVM 对象分配2. 什么情况会发生 Heap OOM3. 模拟 Heap OOM4. Heap OOM 的定位及解决1. JVM 对象分配前面两篇文章介绍了Metaspace区和Java虚拟机栈的内存溢出的分析及解决方案;一般来说,只要配置了合理的jvm参数和代码上注意一些,是不太容易发生这两块区域的内存溢出的。真正最容易发生OOM的,是在 Java堆 中,也就是由于 平常系统中创建出来的对象实在太多了,最终导致了系统的OOM;前面也介绍过了jvm运行时在堆中创建对象和回收的流程,在原创 2021-10-10 23:14:34 · 595 阅读 · 0 评论 -
JVM——13.定位 StackOverflowError
文章目录1. Java虚拟机栈和方法调用2. 什么情况会发生 StackOverflow3. 模拟 StackOverflowError4. StackOverflowError 的定位及解决1. Java虚拟机栈和方法调用在前面OOM的文章里面已经介绍过了Java虚拟机栈相关概念,这里再重复一下。在jvm的内存模型中,有一块叫做java虚拟机栈的地方,每个线程都有一个自己的固定大小的虚拟机栈,也就是 栈内存;一个线程在调用一个方法的时候,会为这个方法创建一个栈帧,这个栈帧中包含了:方法参数、实现业原创 2021-09-26 23:45:48 · 638 阅读 · 0 评论 -
JVM——12.定位 Metaspace OOM
文章目录1. Metaspace区是怎么发生OOM的2. 什么情况会发生Metaspace的OOM3. 模拟 Metaspace OOM4. Metaspace OOM 的定位及解决1. Metaspace区是怎么发生OOM的在jvm中,用来控制Metaspace区域内存大小的参数一般有两个:-XX:MetaspaceSize:Metaspace初始大小;-XX:MaxMetaspaceSize:Metaspace最大大小;也就是说,对应一个jvm来说,Metaspace区域的大小是固定的,比原创 2021-09-26 23:43:03 · 3700 阅读 · 0 评论 -
JVM——11.什么是OOM
文章目录1. 内存泄漏与内存溢出2. 哪些区域会发生OOM2.1 Metaspace2.2 Java虚拟机栈2.3 Java 堆2.4 直接内存(堆外内存)1. 内存泄漏与内存溢出内存泄漏(Memory Leak):程序无法释放已经申请的内存空间;(多次内存泄漏会导致内存溢出)内存溢出(Out Of Memory):一直往JVM内存中存放数据,存不下了就会发生溢出;(程序在申请内存时,没有足够的内存空间可供申请)就我们的Java应用而言,最常见的系统挂掉的原因也就是内存溢出,简称OOM。2.原创 2021-09-01 23:53:23 · 658 阅读 · 1 评论 -
JVM——10.调优工具3(MAT)
文章目录1. 使用背景2. MAT 介绍及使用2.1 MAT 安装2.2 MAT 使用2.2.1 现象2.2.2 分析定位2.2.2.1 查看 overview2.2.2.2 查看 Actions -> Dominator_Tree2.2.2.3 查看 Reports -> Leak Suspects2.2.3 解决问题2.3 总结1. 使用背景在上一篇文章中,我们介绍了可以使用jmap命令对当前运行的系统生成一份dump快照,并且可以使用 jhat启动一个web服务器进行快速查看(但是通过原创 2021-08-16 23:53:25 · 321 阅读 · 0 评论 -
JVM——9.调优工具2(jmap、jhat)
文章目录1. 使用背景2. jmap的介绍及使用2.1 jmap -histo PID2.2 jmap -dump2.3 jhat1. 使用背景在前面jstat命令的介绍中,我们知道了可以用它来轻松的了解到线上系统中JVM的各种运行情况和指标。但是如果有时候发现jvm中新增对象的速度很快,想要知道是什么对象新增这么快;或者我们想要知道在我们的系统中,哪些对象占据了大部分的内存空间。另外就是,如果系统发生卡顿或者频繁GC等现象,就可能是堆内存出了问题,这个时候就需要借助 Java堆的Dump来查看对象原创 2021-08-01 13:30:15 · 717 阅读 · 0 评论 -
JVM——8.调优工具1(jstat)
文章目录1. 使用背景2. jstat 的介绍及使用2.1 jstat -gc PID 介绍2.2 其他的 jstat命令2.3 jstat -gc PID 使用3. 关注指标及计算分析3.1 关注指标3.2 计算分析1. 使用背景一般来说,中大型公司都会有自己的应用监控系统,比如开源的 Zabbix、Open-Falcon、Prometheus等,也可能一些公司自己实现了监控或者告警系统;这些系统可以监控所有在线上的各种应用的运行情况,一旦发生异常(比如CPU利用率过高、FullGC频繁等)会直接通过原创 2021-07-27 23:04:53 · 1816 阅读 · 0 评论 -
JVM——7.GC日志分析2(老年代GC)
文章目录1. 老年代GC1.1 代码执行流程1.2 GC日志分析2. 老年代GC进阶2.1 代码执行流程2.2 GC日志分析1. 老年代GCJVM参数:-Xmx20m -Xms20m -Xmn10m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=15 -XX:PretenureSizeThreshold=3m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+PrintGCDetails -XX:+Print原创 2021-07-09 22:38:12 · 352 阅读 · 0 评论 -
JVM——6.GC日志分析1(模拟对象进入老年代)
文章目录1. 对象进入老年代的条件2. 代码模拟-对象进入老年代2.1 通过分配担保规则进入老年代2.1.1 代码执行流程2.1.2 GC日志分析2.2 达到年龄阈值进入老年代2.2.1 代码执行流程2.2.2 GC日志分析2.3 动态年龄判断进入老年代2.3.1 代码执行流程2.3.2 GC日志分析2.4 大对象直接进入老年代2.4.1 GC日志分析1. 对象进入老年代的条件在前面的文章中,已经整理过了很多次 对象进入老年代的时机了,在这里就再次进行巩固,并用代码模拟对象进入老年代并分析GC日志。对原创 2021-06-06 22:23:08 · 1004 阅读 · 0 评论 -
JVM——5.性能优化
文章目录1. JVM性能优化的是什么1.1 Java系统运行流程梳理1.1.1 新生代1.1.2 老年代1.1.2.1 Full GC1.2 JVM优化的是什么2. 怎么做JVM性能优化2.1 JVM参数2.1.1 JVM参数示例2.1.2 JVM参数汇总2.2 GC 日志2.2.1 Java代码在JVM中的运行流程2.2.2 GC日志分析1. JVM性能优化的是什么不管是在面试题还是平常的技术交流中,大家都在说 JVM调优、JVM优化什么的;那你有没有想过,JVM优化到底在优化什么东西?1.1 Ja原创 2021-05-31 23:33:47 · 310 阅读 · 0 评论 -
JVM——4. 常用垃圾收集器
文章目录1. 新生代收集器1.1 Serial 收集器1.2 ParNew 收集器1.2.1 默认线程数量1.2.2 运行示意图1.3 Parallel Scavenge 收集器1.3.1 控制吞吐量1.3.2 运行示意图2. 老年代收集器2.1 Serial Old 收集器2.1.1 运行示意图2.2 Parallel Old 收集器2.2.1 运行示意图2.3 CMS 收集器2.3.1 CMS垃圾回收流程2.3.1.1 初始标记(CMS initial mark)2.3.1.2 并发标记(CMS con原创 2021-05-18 00:17:23 · 257 阅读 · 0 评论 -
JVM——3. 垃圾回收算法
文章目录1. 为什么需要垃圾回收1.1 可达性分析算法1.2 Java中的引用:1.2.1 强引用(Strong Reference):1.2.2 软引用(Soft Reference):1.2.3 弱引用(Weak Reference):1.2.4 虚引用(Phantom Reference):1.3 对象的真正死亡:1.4 回收方法区:2. 垃圾回收算法2.1 标记-清除算法2.2 复制算法2.2.1 复制算法的优化:Eden区和Survivor区2.2.2 优化的复制算法下Minor GC的过程2.3原创 2021-05-12 23:23:13 · 162 阅读 · 0 评论 -
JVM——2. 对象及内存分配策略与分代
文章目录1 虚拟机对象1.1 对象的创建1.2 对象的内存布局1.3 对象的访问定位2 内存分代与内存分配2.1 内存分代2.1.1 为什么要分代2.1.2 内存分代划分2.1.2.1 新生代(Young)2.1.2.2 老年代(Old)2.1.2.3 永久代(Permanent)(Metaspace)2.2 内存分配策略与回收策略2.2.1 内存分配策略总结:2.2.2 回收策略(GC 策略):2.2.2.1 新生代GC(Minor GC/Young GC)2.2.2.2 老年代GC(Old GC/Ful原创 2021-04-26 22:42:16 · 332 阅读 · 0 评论 -
JVM——1. 运行时数据区域
文章目录1 运行时数据区域1.1 程序计数器1.2 虚拟机栈1.3 本地方法栈1.4 Java堆1.5 方法区1.5.1 运行时常量池1.5.2 直接内存(堆外内存)1 运行时数据区域1.1 程序计数器一块较小的内存空间(线程私有的内存);因为JVM是多线程运行的,所以会有多个线程来并发的执行不同的指令;因此每个线程都会有自己的一个程序计数器,用来记录当前线程执行到了哪一条字节码指令了;字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令:分支、循环、跳转等。唯一一个在J原创 2021-04-10 11:09:47 · 298 阅读 · 2 评论 -
JVM 系列
文章目录JVM 系列概述JVM 系列文章目录JVM 系列概述对于Java领域来说,JVM的重要性不言而喻;我自己也在不断地进行JVM的学习和探索,最开始是读了 “周志明的《深入理解Java虚拟机:JVM高级特性与最佳实践》”一书,算是开始了JVM的入门,这也是一本值得推荐的JVM学习书籍。这本书让我对JVM的基础体系有了一个较为完整的认识,之后又通过一些博客文章、极客时间的课程等学习了一些JVM的进阶知识,并且在日常工作的开发和问题排查过程中也比较注重从JVM的角度来思考和解决问题。通过不断的学习和原创 2021-04-10 10:43:33 · 216 阅读 · 0 评论