- 博客(21)
- 收藏
- 关注
原创 2.JVM性能调优之JVM内存模型深度剖析与优化
minor gc 在根扫描过程中会记录所有被扫描到的对象引用(在年轻代这些引用很少,因为大部分都是垃圾对象不会扫描到),如果引用的对象被复制到新地址了,最后会一并更新引用指向新地址。
2024-10-10 21:51:58 594
原创 5.并发编程之导致JVM内存泄露的ThreadLocal详解
我们首先来看看一段最纯粹的原生 JDBC 获取连接的代码。从上面代码我们可以看到, 在使用 JDBC 时, 我们首先要配置后再拿到 JDBC 连接, 然后在增删改查的业务方法中拿到这个连接,并把我们的 SQL 语句交给 JDBC 连接发送到真实的 DB 上执行。有了上面的连接池,我们再使用。但是上面的代码包含什么样的问题呢?
2024-10-08 18:22:18 955
原创 6.并发编程之CAS&Atomic原子操作
什么是原子性?在工作中我们经常使用事务,事务的一大特性就是原子性(事务具有 ACID 四大特性),一个事务包含多个操作,这些操作要么全 部执行,要么全都不执行。并发里的原子性和原子操作是一样的内涵和概念,假定有两个操作 A 和 B 都包含多个步骤,如果从执行 A 的线程来看,当另一个线程执行 B 时,要么将 B 全部执行完,要么完全不执行 B ,执行 B 的线程看 A 的操作也是一样的,那么 A 和 B 对彼此来说是原子的。
2024-10-08 18:21:07 632
原创 5.Spring
前面已经对 ClassPathXmlApplicationContext 构造函数及设置资源配置路径做了解析,回顾之前的源码。接着来看 Spring 源码的核心执行流程 refresh。
2024-09-27 17:04:58 147
原创 4.Spring占位符解析
首先创建一个 PropertyPlaceholderHelper 的实例对象,然后再执行解析工作。前文介绍了获取 Environment 实例对象,这篇文章来分析解析路径的源码,直接上源码。接着来看 resolveRequiredPlaceholders 的源码。这里有调用了解析助手的 replacePlaceholders 方法。来看 doResolvePlaceholders 的源码。来看具体的解析过程。
2024-09-27 16:42:34 214
原创 3.Spring设置资源加载路径
方法的入参可以传入一个字符串数组的,那么表示它可以一次性接受多个配置文件,使用配置文件的目的是让 Spring 知道,那些 Bean 的生命周期是需要由 Spring 来管理的,将所有的 Bean 配置在一个配置文件中实在是太臃肿了,因此可以按模块配置 Bean,将其划分在不同的配置文件中。可以看到,虽然使用的配置路径是 classpath:spring-beans-${username}.xml,但是任然可以从容器中获取到 HelloWorld 的实例对象,说明 Spring 帮我们进行了路径解析。
2024-09-26 11:04:21 760
原创 2.ClassPathApplicationContext构造函数解析及父类解析
我们在创建 ClassPathXmlApplicationContext 容器对象的时候,使用的是 ClassPathXmlApplicationContext(String configLocation) 构造函数,在该构造函数中,有调用了其他的重载的构造函数,最终会调用下面的构造函数。在调用父类构造函数的过程中,我们需要大概看看在这一过程中,父类定义了那些属性,创建类那些对象,对那些属性进行了初始化,在后面的源码阅读环节中,我们最起码能知道这个对象是在哪里创建的,不至于懵逼。
2024-09-26 00:18:44 355
原创 1.Spring简介与源码概览
Spring 即是一个框架,同时他也是一个生态。其生态包含了许多应用在特定场景的具体框架,如SpringBoot、SpringCloud、SpringSecurity 等。目前我们常说的 Spring 就是指 Spring 框架,其具有优良的扩展性。可以认为 Spring 是 SpringBoot、SpringBoot 等生态的底座。
2024-09-25 23:13:53 1010
原创 1.JVM性能调优值从JDK源码级别彻底剖析JVM类加载机制
自定义类加载器只需要继承 java.lang.ClassLoader 类,该类有两个核心方法,一个是 loadClass(String, boolean),实现双亲委派机制,还有一个方法是findClass,默认实现是空方法,所以我们自定义类加载器主要是 重写findClass方法。");这里需要注意:字节码的文件路径要与包名一致。@Overridetry {// defineClass 将一个字节数组转为Class对象,这个字节数组是class文件读取后最终的字节数组。
2024-09-25 16:20:19 810
原创 4.并发编程之线程间的同步、通信、协调和协作
很多的时候,孤零零的一个线程工作并没有什么太多用处,更多的时候,我们是很多线程一起工作,而且是这些线程间进行通信,或者配合着完成某项工作,这就离不开线程间的通信和协调、 协作。
2024-09-25 11:20:34 872
原创 3.并发编程之线程基础知识
为什么用户线程又被称为协程呢?我们知道,内核线程的切换开销是来自于保护和恢复现场的成本,那如果改为采用用户线程, 这部分开销就能够省略掉吗?答案还是“不能”。但是, 一旦把保护、恢复现场及调度的工作从操作系 统交到程序员手上, 则可以通过很多手段来缩减这些开销。
2024-09-25 10:56:24 761
原创 2.并发编程之Java内存模型(JMM)&并发三大特性
Java 虚拟机规范中定义了Java内存模型(Java Memory Model,JMM),用于屏蔽掉各种硬件和操作系统的内存访问差异,以实现让 Java 程序在各种平台下都能达到一致的并发效果,JMM 规范了 Java 虚拟机与计算机内存是如何协同工作的规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。
2024-09-25 00:15:35 1008
原创 1.并发编程之基础概念
当然可以,用我们平时常用的 QQ 之类的聊天程序来举例,当我们用 QQ 聊天时,其实程序要做好几件事,比如:接受我们的键盘输入,把输入的信息通过网络发给对方,接受对方通过网络发来的信息,把对方的信息显示在屏幕上,很多的时候,这些事情是可以同时发生的。这就意味着,操作系统要保证线程在调度前后的正常执行,所以,操作系统中就有上下文切换的概念,它是。如果设计一个多线程的程序的话,那它就可以同时在多个 CPU 的多个核的多个线程上跑,可以充分地利用 CPU,减少 CPU 的空闲时间,发挥它的运算能力,提高并发量。
2024-09-24 22:17:37 949
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人