自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 自定义多选组件

微信小程序公司和使用人多选功能

2024-07-12 15:12:37 239

原创 git开发分支管理

git开发分支管理

2022-09-03 09:58:49 514 1

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

原创 Druid源码阅读4-监控分析

首先在源码测试用例中找到TestRollBack,在conn.rollback()这行打上断点

2022-05-13 06:42:30 212

原创 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模型二.Netty介绍

2022-05-04 06:15:26 981

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

原创 JVM基础知识

一.编程语言的特点二.java语言的特点三. 不同语言跨平台的区别四.什么是字节码?

2022-04-23 06:22:46 248

原创 OSI分层

2022-04-22 05:56:31 67

原创 chrome抓包

1.network面板概览是体现性能优化的部分2.过滤器has-response-header:Access-Control-Allow-Origin 跨域请求larger-than:1M 大于1M的资源

2022-04-21 07:12:23 308

原创 浏览器输入URL到主页显示,经历了哪些步骤

DNS是多级域名负载均衡是一个分布式系统CDN是缓存

2022-04-21 05:15:35 613

原创 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关注的人

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