- 博客(50)
- 收藏
- 关注
原创 Druid源码阅读10-哪些情况下会丢弃连接?
1.DruidDataSource.shrink(boolean checkTime)方法中异步线程 DestroyTask 对无效的Collection做清除public void shrink(boolean checkTime) { final List<DruidConnectionHolder> evictList = new ArrayList<DruidConnectionHolder>(); try { lock.lockInte
2022-05-20 20:02:57 500
原创 Druid源码阅读9-什么时候会创建新连接?
Druid连接的创建时点1. initialSize>0时,将在init()时进行创建,此时创建连接由是否指定asyncInit参数来判断,需要注意的是,此时如果采用异步创建需要设置线程池,否则即使开启asyncInit也依旧会采用同步创建。2. 开启keepAlive并且initialSize<minIdle,将在init()时进行创建,此时将采用异步方式创建连接3. 抛弃连接(discardConnection)且连接池中活跃连接总数<最小数量,此时采用异步方式创建连接4
2022-05-19 19:30:08 969
原创 Druid源码阅读8-连接泄露检测
removeAbandoned()方法属于DruidDataSource类。这个方法用于连接泄露检测,通过removeAbandoned属性配置是否打开连接泄露检测。源码思路如下:1.获取activeConnectionLockactiveConnectionLock.lock();2.判断连接是否在使用中。pooledConnection.isRunning()3.判断连接创建时间如果大于removeAbandonedTimeoutMillis,设置traceEnable为fals
2022-05-18 17:54:44 418
原创 Druid源码阅读7-AST节点类型
常用的AST节点主要有三种类型:SQLObject、SQLExpr、SQLStatement;其中最常使用的就是 SQLStatement ,其子类常见的有DruidSelectStatement、DruidInsertStatement、DruidUpdateStatement等。今天就来说说SQLStatement。最常用的Statement当然是SELECT/UPDATE/DELETE/INSERT,它们是class SQLSelectStatement implements SQLSt
2022-05-17 16:24:03 463
原创 Druid源码阅读6-SQL解析之AST语法树
Druid的SQL解析器主要有三部分组成,如下:1、Parsera、词法分析b、语法分析2、AST(Abstract Syntax Tree,抽象语法树)3、Visitor在计算机科学中,抽象语法树(AbstractSyntaxTree,AST),或简称语法树(Syntax tree),是源代码语法结构的一种抽象表示,Druid 解析SQL也一样,会遵循一定的规则将SQL分析并构建成语法树AST。Parser主要的作用是生成AST,Parser主要有两部分组成:词法分析、语法分析
2022-05-16 12:54:35 2784
原创 Druid源码阅读5-Parser之SQLStatement
本篇文章来探究Druid解析器如何工作。以下面demo为例:public void test_1() throws Exception { String sql = "SELECT /*mark for picman*/ * FROM WP_ALBUM WHERE MEMBER_ID = ? AND ID IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?
2022-05-14 05:27:42 518
原创 git命令之git stash
git stash :把修改的内容暂存,让工作区干净git stash -list:查看暂存内容git stash apply:恢复工作区git stash pop:恢复工作区,如果有冲突执行下面命令git reset --hard HEAD:清理工作区
2022-05-12 17:55:08 177
原创 git之指定不需要git管理的文件
在项目目录下新建.gitignore文件:vi .gitignore比如不想让git管理idea临时文件在.gitignore中写入:.idea然后使用git status查看,发现不再提示git add .idea
2022-05-12 17:25:03 531
原创 常用的git命令
1.重命名文件:git mv 1.txt 2.txt2.新建分支:git checkout -b 新分支名 版本号3.查看日志:git log --oneline 查看当前分支提交日志git log --oneline --all -n4 查看所有分支最近四次提交日志git log --oneline --all -n4 --graph 查看日志演进历史...
2022-05-12 11:40:06 135
原创 Druid源码阅读3-DruidDataSource之shrink
shrink方法是DestroyTask线程中回收连接的具体执行方法。首先获得锁: try { lock.lockInterruptibly(); } catch (InterruptedException e) { return; } 之后,要判断初始化状态是否完成,如果采用异步初始化,可能DestoryTask线程已经启动,但是连接池还没有初始化完成。
2022-05-12 05:17:09 325
原创 Druid源码阅读2-DruidDataSource之getConnectionDirect ()
在 getConnectionDirect 中,druid主要做了下面的事情:1、尝试获取连接,如果超时就判断是否达到尝试次数,在getConnectionInternal()方法中,如果没到且 activeCount+poolingCount < maxActive 则继续尝试,否则抛出超时异常。2、获取到连接后判断如果开启testOnBorrow,就进行连接的校验。看连接是否正常。如果校验连接异常,则丢弃链接,重新尝试获取。3、如果未开启 testOnBorrow,但开启testWhile
2022-05-11 05:49:45 575
原创 Druid源码阅读1-DruidDataSource之init()
首先,在test中找到连接池的测试Demo在DruidDataSource 这个类中,DruidConnectionHolder 数组存着所有池中的连接private volatile DruidConnectionHolder[] connections;接下来,看看getConnections()方法跟进init()方法看看初始化了什么,可以看到init 方法主要做了下面这些事情1、根据jdbcUrl判断连接的数据库类型,获取对应的JdbcDriver以及初始化Conne.
2022-05-10 06:09:02 1348
原创 垃圾回收之并行GC
1.特点年轻代和老年代的垃圾回收都会触发 STW 事件。在年轻代使用 标记-复制(mark-copy)算法,在老年代使用 标记-清除-整理(mark-sweepcompact)算法。-XX:ParallelGCThreads=N 来指定 GC 线程数, 其默认值为 CPU 核心数。 并行垃圾收集器适用于多核服务器,主要目标是增加吞吐量。因为对系统资源的有效使用,能达到 更高的吞吐量:• 在 GC 期间,所有 CPU 内核都在并行清理垃圾,所以总暂停时间更短;• 在两次 GC 周期的间隔期
2022-05-09 05:46:56 259
原创 JVM内存模型
一.JVM堆内存结构堆内存是所有线程共用的内存空间,JVM 将 Heap 内存分为年轻代(Young generation)和 老年代(Old generation, 也叫 Tenured)两部分。年轻代还划分为 3 个内存池,新生代(Eden space)和存活区(Survivor space), 在大部分 GC 算法中有 2 个存活区(S0, S1),在我们可 以观察到的任何时刻,S0 和 S1 总有一个是空的, 但一般较小,也不浪费多少空间。Non-Heap 本质上还是 Heap,只是一般
2022-05-06 05:32:04 512
原创 taro-vue3监听左滑/右滑手势退出
一.业务背景我做的是一个要货小程序,没有华丽的页面,没有购物车,就是在要货页面填写要货数量,然后跳转到预览页面。预览页面有保存和支付按钮。可以先点保存,再点支付。也可以直接点支付,支付的同时进行保存。问题:支付成功后直接跳转回菜单页面,但是保存后会停留在预览页面,毕竟还有个支付按钮可以点。问题就在这了,保存成功后点回退页面,不应该再回到要货页面,而应该回到菜单页面。二.解决过程1.第一步,我在预览页面做了自定义头部导航栏,根据订单号是否为空,来判断是跳回一个页面,还是跳回菜单页面。因为保存之
2022-05-04 15:35:58 4258 2
原创 IO 通信
一.服务器通信过程分析二.socket通信流程在linux系统上,用户进程在用户空间里,而操作系统进程在内核空间里,当socket与外部线程交互时,需要通过socket网卡读取到内核空间,然后从内核空间复制到用户空间。从socket发送数据时,也是这样的流程。...
2022-05-03 06:30:53 500
原创 JVM分析调优指标
一.分配速率分配速率(Allocation rate)表示单位时间内分配的内存量。通常使用 MB/sec作 为单位。上一次垃圾收集之后,与下一次GC开始之前的年轻代使用量,两者的差 值除以时间,就是分配速率。分配速率过高就会严重影响程序的性能,在 JVM 中可能会导致巨大的 GC 开销二.提升速率...
2022-05-02 10:09:23 936
原创 taro框架开发小程序经验总结
最近这一年来,做了三个小程序。第一个小程序用的原生框架,所有的样式和js都要自己写,不好看还写得头疼死。写第二个小程序的时候正觉得VUE3流行,想熟悉一下VUE3,因此找到了taro框架。这个框架好不好我也无从分辨,暂时能用就行。一.搭建项目1.taro 客户端安装,想用taro开发小程序这个是必须要先安装npm install -g @tarojs/cli此处参考官方文档:安装及使用 | Taro 文档2.创建项目taro init myApp我的选择如下:3.项目会自
2022-05-01 06:43:03 4027 2
原创 内存溢出相关错误
一.OutOfMemoryError: Java heap space创建新的对象时,堆内存中的空间不足以存放新创建的对象产生的原因,很多时候就类似于将 XXL 号的对象,往 S 号的 Java heap space 里面塞。其实清楚了原因,问 题就很容易解决了:只要增加堆内存的大小,程序就能正常运行。另外还有一些情况是由代码问题导致的:• 超出预期的访问量/数据量:应用系统设计时,一般是有 “容量” 定义的,部署这么多机器,用来处理一定 流量的数据/业务。 如果访问量突然飙升,超过预期
2022-05-01 06:08:29 87
原创 JVM 线程堆栈数据分析
一.JVM线程模型示意图JVM 内部线程主要分为以下几种:• VM 线程:单例的 VMThread 对象,负责执行 VM 操 作;• 定时任务线程:单例的 WatcherThread 对象, 模拟 在 VM 中执行定时操作的计时器中断;• GC 线程:垃圾收集器中,用于支持并行和并发垃圾 回收的线程;• 编译器线程: 将字节码编译为本地机器代码;• 信号分发线程:等待进程指示的信号,并将其分配给 Java 级别的信号处理方法。二.JVM在GC过程中怎么暂停其他线程的?使用
2022-05-01 06:04:24 807
原创 垃圾回收之G1 GC
一.设计目标将 STW 停顿的时间和分布,变成 可预期且可配置的1)首先,堆不再分成年轻代和老年代,而是划分为多个(通常是 2048个)可以存放对象的小块堆区域(smaller heap regions)。 每个小块,可能一会被定义成 Eden 区,一会被指定为 Survivor 区或者Old 区。在逻辑上,所有的 Eden 区和 Survivor 区合起来 就是年轻代,所有的 Old 区拼在一起那就是老年代2)这样划分之后,使得 G1 不必每次都去收集整 个堆空间,而是以增量的方式来进行处
2022-04-29 09:50:26 696
原创 垃圾回收之ZGC/Shenandoah GC
1.特点1)GC 最大停顿时间不超过 10ms2)堆内存支持范围广,小至几百 MB 的堆空间,大至 4TB 的超大堆内 存(JDK13 升至 16TB) 3)与 G1 相比,应用吞吐量下降不超过 15%4)当前只支持 Linux/x64 位平台,JDK15 后支持 MacOS 和 Windows 系统2.参数配置...
2022-04-29 09:42:33 579
原创 垃圾回收之GC对比
一.各个 GC 对比二.常用的 GC 组合(1)Serial+Serial Old 实现单线程的低延迟 垃圾回收机制;(2)ParNew+CMS,实现多线程的低延迟垃 圾回收机制;(3)Parallel Scavenge和Parallel Scavenge Old,实现多线程的高吞吐量垃圾 回收机制。三.GC 如何选择选择正确的 GC 算法,唯一可行的方式就是去尝试,一般性的指导原则:1. 如果系统考虑吞吐优先,CPU 资源都用来最大程度处理业务,用 Parallel .
2022-04-29 09:35:55 332
原创 垃圾回收之串行GC
1.特点串行 GC 对年轻代使用 mark-copy(标记-复制) 算法,对老年代使用 mark-sweep-compact(标记-清除整理)算法。两者都是单线程的垃圾收集器,不能进行并行处理,所以都会触发全线暂停(STW),停止所有的应用线程。 因此这种 GC 算法不能充分利用多核 CPU。不管有多少 CPU 内核,JVM 在垃圾收集时都只能使用单个核心。CPU 利用率高,暂停时间长。简单粗暴,就像老式的电脑,动不动就卡死。该选项只适合几百 MB 堆内存的 JVM,而且是单核 CPU 时比
2022-04-29 08:55:44 116
原创 垃圾回收之CMS GC
一.六个阶段阶段 1: Initial Mark(初始标记)这个阶段伴随着 STW 暂停。初始标记的目标是标记所有的 根对象,包括根对象直接引用的对象,以及被年轻代中所 有存活对象所引用的对象(老年代单独回收)。阶段 2: Concurrent Mark(并发标记)在此阶段,CMS GC 遍历老年代,标记所有的存活对象,从 前一阶段 “Initial Mark” 找到的根对象开始算起。 “并发标 记”阶段,就是与应用程序同时运行,不用暂停的阶段。阶段 3: Concurre.
2022-04-28 06:06:25 2306
原创 JVM垃圾回收机制
一.内存池划分二.GC 的一般原理对象分配在新生代的 Eden 区, 标记阶段 Eden 区存活的对象就会复制到存活区;注意:为什么是复制,不是移动???两个存活区 from 和 to,互换角色。对象存活到一定周期会提升到老年代。老年代默认都是存活对象,采用移动方式: 1. 标记所有通过 GC roots 可达的对象; 2. 删除所有不可达对象; 3. 整理老年代空间中的内容,方法是将所有的存 活对象复制,从老年代空间开始的地方依次存 放。三.GC的三种算法1.清除算法
2022-04-28 06:01:52 293
原创 JVM 图形化工具
一.jconsole在命令行输入 jconsole 即可打开 本地 JVM 可以直接选择 远程 JVM 可以通过 JMX 方式连接二.jvisualvm在命令行输入 jconsole 即可打开 本地 JVMhttps://visualvm.github.io/download.htmlhttps://visualvm.github.io/download.html三.jmc在命令行输入 jmc即可打开 本地 JVM,看飞行记录器Oracle Java Mission Contr.
2022-04-28 04:56:35 265
原创 JVM 命令行工具
一.概览二.jstat用法jstat -gcutil pid 1000 1000jstat -gc pid 1000 1000二.jmap用法常用选项就 3 个:-heap 打印堆内存(/内存池)的配置和 使用信息。-histo 看哪些类占用的空间最多, 直方图。-dump:format=b,file=xxxx.hprof Dump 堆内存。演示:jmap -heap pidjmap -histo pidjmap -dump:format=b,f.
2022-04-26 06:10:03 178
原创 JVM 类加载器
一.类的生命周期1. 加载(Loading):找 Class 文件2. 验证(Verification):验证格式、依赖3. 准备(Preparation):静态字段、方法表4. 解析(Resolution):符号解析为引用5. 初始化(Initialization):构造器、静态变 量赋值、静态代码块6. 使用(Using)7. 卸载(Unloading)二.类的加载时机1. 当虚拟机启动时,初始化用户指定的主类,就是启动执行的 main 方法所在的类;2. .
2022-04-24 06:37:12 198
原创 java命令行
编译:javac demo/jvm0104/HelloByteCode.java查看字节码:javap -c demo.jvm0104.HelloByteCode更详细地查看字节码:javap -c -verbose demo.jvm0104.HelloByteCode
2022-04-23 06:29:32 340
原创 chrome抓包
1.network面板概览是体现性能优化的部分2.过滤器has-response-header:Access-Control-Allow-Origin 跨域请求larger-than:1M 大于1M的资源
2022-04-21 07:12:23 308
原创 git命令之新建仓库
一. 本地操作1)在本地新建文件夹mkdir myTest2)进入myTest并查看文件夹内容cd myTestdir /d3)在myTest目录下用git命令初始化git init4)新建文件测试text.html5)添加工作区文件到暂存区git add text.html用git status命令查看状态二. github操作1)新建库myTest2)按照github命令提示执行库地址有两种:HTTPS和SSH,建议使用SSHgit.
2022-04-20 06:47:01 6845
原创 小程序支付流程总结
1 开通商户号2 商户号平台操作2.1 绑定小程序appId2.1.1登录商户平台-产品中心-账号关联(AppID绑定),绑定小程序appId2.1.2登录微信公众平台,点击“微信支付-商户号管理”,查看相关商户号信息,确认授权申请,或在“公众平台安全助手”下发的模板消息中确认授权信息;2.2 设置API密钥进入【账户中心】->【账户设置】->【API安全】->【API密钥】中设置,建议把APIV2和APIV3设置成一样的2.3 开通JSAPI支付产品中心->JSAP
2022-04-05 13:00:00 3384
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人