自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 JVM——17.系统上线的JVM配置步骤

文章目录1. 预评估阶段2. JVM 参数模板3. 压力测试4. 上线后的监控1. 预评估阶段对于一个新系统面临上线,需要设置线上的jvm参数,最严谨的方法当然是:评估系统中各个接口的一次请求大概会产生多少M的对象;评估系统一秒大概会接收到多少个请求,这些请求分布在哪些接口,一共会产生多少M的对象;根据每秒生成的对象大小,估计新生代需要给多少的内存,YGC发生的频率,进入老年代的频率;再估计老年代应该给多少的内存,FGC发生的频率等;最终得到需要选择什么样配置的机器,和大概的JVM配置参数;

2021-11-18 23:45:22 1042 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 983

原创 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 1187

原创 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

原创 JVM——13.定位 StackOverflowError

文章目录1. Java虚拟机栈和方法调用2. 什么情况会发生 StackOverflow3. 模拟 StackOverflowError4. StackOverflowError 的定位及解决1. Java虚拟机栈和方法调用在前面OOM的文章里面已经介绍过了Java虚拟机栈相关概念,这里再重复一下。在jvm的内存模型中,有一块叫做java虚拟机栈的地方,每个线程都有一个自己的固定大小的虚拟机栈,也就是 栈内存;一个线程在调用一个方法的时候,会为这个方法创建一个栈帧,这个栈帧中包含了:方法参数、实现业

2021-09-26 23:45:48 639

原创 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 3706

原创 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 323

原创 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

原创 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

原创 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 354

原创 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 1006

原创 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 311

原创 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

原创 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 163

原创 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

原创 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 299 2

原创 JVM 系列

文章目录JVM 系列概述JVM 系列文章目录JVM 系列概述对于Java领域来说,JVM的重要性不言而喻;我自己也在不断地进行JVM的学习和探索,最开始是读了 “周志明的《深入理解Java虚拟机:JVM高级特性与最佳实践》”一书,算是开始了JVM的入门,这也是一本值得推荐的JVM学习书籍。这本书让我对JVM的基础体系有了一个较为完整的认识,之后又通过一些博客文章、极客时间的课程等学习了一些JVM的进阶知识,并且在日常工作的开发和问题排查过程中也比较注重从JVM的角度来思考和解决问题。通过不断的学习和

2021-04-10 10:43:33 216

原创 Spring——7. 事务介绍及源码实现(二)

文章目录2.2 事务增强器2.2.1 创建事务2.2.1.1 创建并获取事务2.2.1.1.1 创建事务对象2.2.1.1.2 事务超时设置验证2.2.1.1.3 事务传播行为PropagationBehavior验证2.2.1.1.4 开启事务2.2.1.2 处理已经存在的事务2.2.1.2.1 Spring事务传播行为2.2.1.2.2 Spring事务传播行为的实现2.2.1.3 准备事务信息 TransactionInfo2.2.2 执行目标方法2.2.3 异常回滚处理2.2.3.1 回滚条件2.2

2021-02-02 00:08:14 191

原创 Spring——7. 事务介绍及源码实现(一)

文章目录1. 事务的简单使用示例2. 事务的实现2.1 事务自定义标签2.1.1 注册 InfrastructureAdvisorAutoProxyCreator2.1.2 获取class/method的所有增强器2.1.3 获取匹配的增强器2.1.3.1 匹配的准备工作2.1.3.2 提取事务属性和进行匹配Spring事务在软件开发领域中,全有或者全无的操作被称为事务(Transaction),事务允许将几个操作组合成 一个要么全部发生要么全部不发生的工作单元。Spring为事务管理提供了丰富的功能

2021-01-24 18:40:04 251

原创 Spring——6. AOP介绍及源码实现(二)

文章目录1. 创建代理2.1 封装Advisor2.2 获取代理对象2.2.1 创建代理2.2.2 获取代理2.2.2.1 JDK动态代理的使用2.2.2.1.1 使用示例2.2.2.1.1 SpringJDK动态代理的实现2.2.2.2 CGLIB代理的使用2.2.2.2.1 使用示例2.2.2.2.2 CGLIB代理的实现1. 创建代理在上文Spring——6. AOP介绍及源码实现(一)的最后已经完成了获取所有对应bean的增强器,在这篇文章中再来继续代理的创建及获取。AbstractAuto

2021-01-16 17:35:15 554

原创 Spring——6. AOP介绍及源码实现(一)

文章目录1. AOP介绍1.1 AOP简介1.2 AOP术语1.2.1 定义切点1.2.2 编写切点2. AOP源码实现2.1 AOP简单使用示例2.2 AOP实现2.2.1 AOP自定义标签2.2.1.1 注册 AnnotationAwareAspectJAutoProxyCreator2.2.2 创建AOP代理2.2.2.1 执行postProcessBeforeInstantiation()方法2.2.2.1.1 加载所有增强器2.2.2.1.1.1 增强器的获取2.2.2.1.1.2 增加同步实例化

2020-12-24 23:45:01 297 1

原创 Spring——5. ApplicationContext容器的功能扩展

文章目录1. XML配置文件的读取1.1 ApplicationContext配置文件的读取1.1.1 设置配置路径2. 扩展功能2.1 环境准备2.1.1 initPropertySources2.1.2 validateRequiredProperties2.2 初始化BeanFactory2.2.1 定制BeanFactory2.2.2 加载BeanDefinition2.3 正式扩展功能2.3.1 增加SpEL语言的支持2.3.2 增加属性注册编辑器2.3.3 增加 ApplicationConte

2020-12-14 22:21:20 355

原创 Spring——4. Bean的加载(二)

文章目录1. Spring中的循环依赖1.1 什么是循环依赖1.2 Spring中对于循环依赖的解决1.2.1 构造器循环依赖1.2.2 setter循环依赖(singleton)1.2.3 setter循环依赖(prototype)2. 真正创建bean(doCreateBean)2.1 创建bean的实例2.1.1 解析class2.1.2 处理Supplier2.1.3 处理factoryMethodName2.1.4 解析构造函数2.1.4.1 autowireConstructor2.1.4.2

2020-12-05 00:26:47 280

原创 Spring——4. Bean的加载(一)

文章目录1. 转换对应的beanName1.1 FactoryBean1.1.1 FactoryBean的作用1.1.2 FactoryBean的使用1.2 转换beanName2. 缓存中获取单例bean3. 从bean实例中获取真正的bean对象4. 从头开始bean实例的加载4.1 原型模式的依赖检查4.2 检测parentBeanFactory4.3 标记 alreadyCreated4.4 转换GenericBeanDefinition为RootBeanDefinition4.5 寻找依赖4.6

2020-11-23 23:01:55 247

原创 Spring——3. 自定义标签的解析

文章目录1. 自定义标签的使用2. 自定义标签的解析2.1 获取自定义标签的命名空间2.2 获取自定义标签的自定义处理器2.2.1 获取handlerMappings2.2.2 通过namespaceUri获取NamespaceHandler2.3 解析自定义标签2.3.1 获取自定义标签的自定义解析器2.3.2 调用父类解析器进行解析3. 整体流程思维导图自定义标签的解析在上文中完成了Spring中对默认标签的解析过程的分析,现在继续Spring中自定义标签的解析。delegate.parseCus

2020-11-19 23:23:12 176

原创 Spring——2. 默认标签的解析

文章目录1. bean标签的解析及注册1.1 解析BeanDefinition1.1.1 创建用于承载属性的 BeanDefinition1.1.1.1 AbstractBeanDefinition1.1.1.2 GenericBeanDefinition1.1.2 解析各种属性1.1.3 解析子元素 meta1.1.4 解析子元素 lookup-method1.1.5 解析子元素 replaced-method1.1.6 解析子元素 constructor-arg1.1.7 解析子元素 property1

2020-11-12 22:52:24 262

原创 Spring——1. BeanFactory容器的初始化

最近在学习Spring源码相关部分,第一篇文章就从Spring源码开始吧。文章目录1. XML配置文件的读取1.1 XmlBeanFactory配置文件的读取1.1.1 ClassPathResource到Resource1.1.2 XmlBeanFactory加载BeanDefinitions2. 加载BeanDefinitions2.1 XML配置文件解析的准备阶段2.1.1 获取XML的验证模式2.1.1.1 DTD2.1.1.2 XSD2.1.1.3 验证模式的读取2.1.2 获取Document

2020-11-07 22:14:15 518

原创 重新起航

注销了以前的账号,新开个账号,重新开始。自我介绍一下,毕业两年,一直从事java相关工作,致力于java相关基础和源码方向的学习和探究。程序生涯中,总得留下点什么,从这里开始吧。

2020-11-07 22:05:18 156

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除