摘要: Bean生命周期注解大致有这么多,创建并注册Bean,bean初始化与销毁,以及scope、conditional、primary、lazy等注解。 bean的初始化与销毁 BeanPostProcessor工作原理 我们给自定义的postProcessBeforeInitialization方法打 阅读全文
posted @ 2022-03-04 08:01 Awecoder 阅读(216) 评论(0) 推荐(0) 编辑
摘要: 问题是我在完成LeetCode第23题时遇到的,我采用的是最小堆加上递归的解决方式。递归中,我对参数数组lists做了foreach,并且赋值,发现lists的值不会改变,结果是栈溢出。 当改成直接修改数组元素时AC。 for (int i = 0; i < lists.length; i++) { 阅读全文
posted @ 2022-02-25 23:59 Awecoder 阅读(705) 评论(0) 推荐(0) 编辑
摘要: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 解题思路1:链表迭代实现 当两个链表都不为空时,迭代判断大小,添加节点。一方为空,则直接补另一方剩下所有的节点。 时间复杂度取决于两个链表长度,O(m+n)。 空间复杂度小,只需要修改指针指向性,O(1 阅读全文
posted @ 2022-02-22 08:09 Awecoder 阅读(115) 评论(0) 推荐(0) 编辑
摘要: 彻底搞清楚class常量池、运行时常量池、字符串常量池 常量池-静态常量池 也叫 class文件常量池,主要存放编译期生成的各种字面量(Literal)和符号引用(Symbolic References)。 字面量:例如文本字符串、fina修饰的常量。 int b = 2; int c = "abc 阅读全文
posted @ 2022-02-10 23:06 Awecoder 阅读(3630) 评论(1) 推荐(0) 编辑
摘要: 1 JDK8打印并分析GC日志 1.1 打印日志 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseSerialGC -Xmx1m -Xloggc:./gc-serial.log 参数 功能 -XX:+ 阅读全文
posted @ 2022-02-09 09:34 Awecoder 阅读(1999) 评论(0) 推荐(1) 编辑
摘要: JVM参数选项 # 查看标准选项 java -help # 查看-X选项 java -X # 查看高级选项 -XX java -XX:+UnlockExperimentalVMOptions -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsInitial 阅读全文
posted @ 2022-02-09 09:33 Awecoder 阅读(414) 评论(0) 推荐(0) 编辑
摘要: JVM故障运维工具 1 jps 查看进程pid jps 2 jmap 查看堆内存 1 用来查看内存信息,实例个数以及占用内存大小 #查看历史生成的实例 jmap -histo <pid> > ./log.txt #查看当前存活的实例,执行过程中可能会触发一次full gc jmap -histo:l 阅读全文
posted @ 2022-02-08 21:47 Awecoder 阅读(86) 评论(0) 推荐(0) 编辑
摘要: 对象内存分配流程图 3.1 栈上分配 Java对象都是在堆上进行分配,在对象没有被引用时,依赖GC回收内存。当对象数量过多,便会给GC带了较大压力,影响应用性能。JVM提供了栈上分配机制,用于减少临时对象在堆上的分配数量。 JVM通过逃逸分析确定该对象不会被外部访问。如果不会逃逸,可以优化对象内存分 阅读全文
posted @ 2022-01-16 23:36 Awecoder 阅读(388) 评论(0) 推荐(0) 编辑
摘要: 2 Java对象内存模型 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、 实例数据(Instance Data)和对齐填充(Padding)。 在 JVM 中,Java对象保存在堆中时,由以下三部分组成: 对象头(object header):包括了关于堆 阅读全文
posted @ 2022-01-16 23:35 Awecoder 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 1 对象的创建 对象创建的主要流程: 1.类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 new指令对应到语言层面上讲是,new关键词、对象克 阅读全文
posted @ 2022-01-16 23:33 Awecoder 阅读(840) 评论(0) 推荐(0) 编辑
摘要: 本文仍然基于JDK8版本,从JDK9模块化器,类加载器有一些变动。 0 javac编译 java代码 public class Math { public static final int initData = 666; public static User user = new User(); p 阅读全文
posted @ 2022-01-09 19:26 Awecoder 阅读(360) 评论(2) 推荐(1) 编辑
摘要: 1 CPU使用率过高问题定位 1.1 配合使用top+jstack定位(重要) 首先使用top找到CPU使用率最高的进程。 接着查看36032进程的线程情况。 top -Hp 36032 找到36044线程CPU占用率最高,然后将线程号转为16进制。 # printf %x 36044 8ccc 最 阅读全文
posted @ 2022-01-03 09:23 Awecoder 阅读(392) 评论(0) 推荐(0) 编辑
摘要: 垃圾收集器:利用垃圾收集算法,实现垃圾回收的实践落地。 1 HotSpot垃圾回收器 HotSpot垃圾回收器有多个,可以配合使用。 1.1 垃圾回收的一些术语 术语: Stop the world 简写为STW,也叫全局停顿,Java代码停止运行,native代码继续运行,但不能与JVM进行交互。 阅读全文
posted @ 2022-01-02 12:40 Awecoder 阅读(273) 评论(0) 推荐(0) 编辑
摘要: 1 什么时候回收垃圾? 1、什么场景下该使用什么垃圾回收策略? 在对内存要求苛刻的场景:想办法提高对象的回收效率,多回收掉一些对象,腾出更多内存。 在CPU使用率高的情况下:降低高并发时垃圾回收的频率,让CPU更多的去执行你的业务而不是垃圾回收。 2、垃圾回收发生在哪些区域? 堆(回收对象)、方法区 阅读全文
posted @ 2021-12-28 23:58 Awecoder 阅读(369) 评论(0) 推荐(0) 编辑
摘要: 逃逸分析:分析变量是否逃出它的作用域 全局变量赋值逃逸 方法返回值逃逸 实例引用逃逸 线程逃逸:赋值给类变量或者可以在其他线程中访问的实例变量 public class EscapeTest { public static SomeClass someClass; // 1 public void 阅读全文
posted @ 2021-12-26 22:27 Awecoder 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 编译器优化机制详解 1 字节码是如何执行的? 主要包含解释执行(由解释器一行一行翻译执行)和编译执行(将字节码编译成机器码,直接执行机器码)。 解释执行:优势在于没有编译的等待时间,性能相对编译执行差。 编译执行:运行效率高,比解释执行快一个数量级;会带来额外的开销(CPU,内存) 查看和切换运行模 阅读全文
posted @ 2021-12-26 17:19 Awecoder 阅读(503) 评论(0) 推荐(0) 编辑
摘要: 方法内联的思想是,把目标方法的代码复制代发起调用的方法之中,避免发生真实的方法调用。 public class InlineTest { private static int add1(int x1, int x2, int x3, int x4) { return add2(x1, x2) + a 阅读全文
posted @ 2021-12-26 17:17 Awecoder 阅读(338) 评论(1) 推荐(0) 编辑
摘要: SimpleMemory 侧边栏 <script type="text/javascript"> window.cnblogsConfig = { info: { name: 'Awecoder', startDate: '2021-01-01', avatar: 'http://pic.cnblo 阅读全文
posted @ 2021-12-23 07:42 Awecoder 阅读(150) 评论(0) 推荐(0) 编辑
摘要: Spring: Spring是一个轻量级的控制反转(IOC/DI)和面向切面(AOP)的容器框架。 轻量级主要针对最小侵入编程而言,不会强迫实现或继承框架类。 实现解耦:使用DI实现应用对象之间的解耦,使用AOP实现横向关注点(系统服务)与业务逻辑的解耦。 容器:Spring容器负责对象的创建、装配 阅读全文
posted @ 2021-12-12 14:50 Awecoder 阅读(208) 评论(0) 推荐(0) 编辑
摘要: JDBC是Java数据库操作的底层规范,定义连接、查询,不同数据库都提供JDBC驱动。 Druid和HikariCP都是数据源,或者简单点说是数据库连接池。 ShardingShpere是用来做分库分表。 对象与关系数据库存在范式不匹配,因此有了ORM操作。例如粒度(类和表)、是否有继承、唯一性(相 阅读全文
posted @ 2021-12-02 00:04 Awecoder 阅读(306) 评论(0) 推荐(0) 编辑