<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[w1lgy的博客]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/w1lgy</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; w1lgy]]></copyright><item><title><![CDATA[JVM工具]]></title><link>https://blog.csdn.net/w1lgy/article/details/126521899</link><guid>https://blog.csdn.net/w1lgy/article/details/126521899</guid><author>w1lgy</author><pubDate>Thu, 25 Aug 2022 12:18:47 +0800</pubDate><description><![CDATA[记录了“堆内存使用情况”、“线程”、“类”、“CPU使用情况”共四个资源的实时情况；并且在时间范围可以选择从1分钟到1年的显示情况。]]></description><category></category></item><item><title><![CDATA[jvm参数调优]]></title><link>https://blog.csdn.net/w1lgy/article/details/126496422</link><guid>https://blog.csdn.net/w1lgy/article/details/126496422</guid><author>w1lgy</author><pubDate>Thu, 25 Aug 2022 12:13:51 +0800</pubDate><description><![CDATA[一、了解JVM参数
JVM参数类型：
常见垃圾回收器组合参数设定：(1.8)
GC常用参数
Parallel常用参数
CMS常用参数
G1常用参数
二、调优
1、调优前的基础概念：
2、什么是调优？
3、调优，从规划开始
三、日志详解
ps日志
CMS
G1
四、案例分析
案例1
案例2]]></description><category></category></item><item><title><![CDATA[Java类的加载过程]]></title><link>https://blog.csdn.net/w1lgy/article/details/126434976</link><guid>https://blog.csdn.net/w1lgy/article/details/126434976</guid><author>w1lgy</author><pubDate>Sat, 20 Aug 2022 06:36:55 +0800</pubDate><description><![CDATA[应用程序根据自身需要自定义的ClassLoader，如Tomcat、Jboss都会根据j2ee规范实现ClassLoader。]]></description><category></category></item><item><title><![CDATA[mysql45讲之事务到底是隔离的还是不隔离的？]]></title><link>https://blog.csdn.net/w1lgy/article/details/125644721</link><guid>https://blog.csdn.net/w1lgy/article/details/125644721</guid><author>w1lgy</author><pubDate>Wed, 06 Jul 2022 17:47:08 +0800</pubDate><description><![CDATA[InnoDB里面每个事务有一个唯一的事务ID，叫作transaction id。它是在事务开始的时候向InnoDB的事务系统申请的，是按申请顺序严格递增的。而每行数据也都是有多个版本的。每次事务更新数据的时候，都会生成一个新的数据版本，并且把transaction id赋值给这个数据版本的事务ID，记为row trx_id。同时，旧的数据版本要保留，并且在新的数据版本中，能够有信息可以直接拿到它。也就是说，数据表中的一行记录，其实可能有多个版本(row)，每个版本有自己的row trx_id。在MySQL里]]></description><category></category></item><item><title><![CDATA[mysql45讲之全局锁和表锁和行锁]]></title><link>https://blog.csdn.net/w1lgy/article/details/125643002</link><guid>https://blog.csdn.net/w1lgy/article/details/125643002</guid><author>w1lgy</author><pubDate>Wed, 06 Jul 2022 17:04:06 +0800</pubDate><description><![CDATA[根据加锁的范围，MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。MySQL提供了一个加全局读锁的方法，命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候，可以使用这个命令，之后其他线程的以下语句会被阻塞：数据更新语句（数据的增删改）、数据定义语句（包括建表、修改表结构等）和更新类事务的提交语句。**全局锁的典型使用场景是，做全库逻辑备份。**也就是把整库每个表都select出来存成文本。官方自带的逻辑备份工具是mysqldump。当my]]></description><category></category></item><item><title><![CDATA[mysql45讲之深入浅出索引]]></title><link>https://blog.csdn.net/w1lgy/article/details/125642328</link><guid>https://blog.csdn.net/w1lgy/article/details/125642328</guid><author>w1lgy</author><pubDate>Wed, 06 Jul 2022 16:29:55 +0800</pubDate><description><![CDATA[在MySQL中，索引是在存储引擎层实现的，所以并没有统一的索引标准，即不同存储引擎的索引的工作方式并不一样。而即使多个存储引擎支持同一种类型的索引，其底层的实现也可能不同。InnoDB应用最广泛，这里就说说InnoDB的索引模型。聚簇索引保证关键字的值相近的元组存储的物理位置也相同（所以字符串类型不宜建 立聚簇索引，特别是随机字符串，会使得系统进行大量的移动操作），且一个表只能 有一个聚簇索引。因为由存储引擎实现索引，所以，并不是所有的引擎都支持聚簇索 引。目前，只有solidDB和InnoDB支持。在In]]></description><category></category></item><item><title><![CDATA[mysql45讲之事务隔离：为什么你改了我还看不见？]]></title><link>https://blog.csdn.net/w1lgy/article/details/125641954</link><guid>https://blog.csdn.net/w1lgy/article/details/125641954</guid><author>w1lgy</author><pubDate>Wed, 06 Jul 2022 16:12:29 +0800</pubDate><description><![CDATA[事务的一些基本概念可以从我之前写的这篇文章看：spring事务管理
在MySQL中，实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值，通过回滚操作，都可以得到前一个状态的值。假设一个值从1被按顺序改成了2、3、4，在回滚日志里面就会有类似下面的记录。
不同时刻启动的事务会有不同的read-view，同一条记录在系统中可以存在多个版本，就是数据库的多版本并发控制（MVCC）。当某一事务要查看其所在read-view的值时，要从当前值一直回滚到其read-view所在的位置才能得到其事务所在版]]></description><category></category></item><item><title><![CDATA[mysql45讲之日志系统：一条SQL更新语句是如何执行的？]]></title><link>https://blog.csdn.net/w1lgy/article/details/125639933</link><guid>https://blog.csdn.net/w1lgy/article/details/125639933</guid><author>w1lgy</author><pubDate>Wed, 06 Jul 2022 15:01:14 +0800</pubDate><description><![CDATA[经过上一节我们知道mysql分为server层和存储引擎层。这一节我们要来了解mysql这两个模块的处理日志。最开始MySQL里并没有InnoDB引擎。MySQL自带的引擎是MyISAM，但是MyISAM没有crash-safe的能力，binlog日志只能用于归档。而InnoDB是另一个公司以插件形式引入MySQL的，既然只依靠binlog是没有crash-safe能力的，所以InnoDB使用另外一套日志系统——也就是redo log来实现crash-safe能力。所以InnoDB被mysql官方引入之后就]]></description><category></category></item><item><title><![CDATA[mysql45讲之基础架构：一条SQL查询语句是如何执行的？]]></title><link>https://blog.csdn.net/w1lgy/article/details/125639802</link><guid>https://blog.csdn.net/w1lgy/article/details/125639802</guid><author>w1lgy</author><pubDate>Wed, 06 Jul 2022 14:56:10 +0800</pubDate><description><![CDATA[Server层包括连接器、查询缓存、分析器、优化器、执行器等，涵盖MySQL的大多数核心服务功能，以及所有的内置函数（如日期、时间、数学和加密函数等），所有跨存储引擎的功能都在这一层实现，比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。校验用户名和密码，校验保留权限，一个用户成功建立连接后，即使你用管理员账号对这个用户的权限做了修改，也不会影响已经存在连接的权限。建立连接的过程通常是比较复杂的，所以我建议你在使用中要尽量减少建立连接的动作，也就是尽量使用长连接。但是全部使用长连接后，你可能会]]></description><category></category></item><item><title><![CDATA[java中内存泄漏和内存溢出是什么]]></title><link>https://blog.csdn.net/w1lgy/article/details/125621071</link><guid>https://blog.csdn.net/w1lgy/article/details/125621071</guid><author>w1lgy</author><pubDate>Tue, 05 Jul 2022 15:52:00 +0800</pubDate><description><![CDATA[一、内存泄漏memory leak :
是指程序在申请内存后，无法释放已申请的内存空间，一次内存泄漏似乎不会有大的影响，但内存泄漏堆积后的后果就是内存溢出。指程序申请内存时，没有足够的内存供申请者使用，或者说，给了你一块存储int类型数据的存储空间，但是你却存储long类型的数据，那么结果就是内存不够用，此时就会报错OOM,即所谓的内存溢出。第一步，修改JVM启动参数，直接增加内存。(-Xms，-Xmx参数一定不要忘记加。)第二步，检查错误日志，查看“OutOfMemory”错误前是否有其 它异常或错误。第]]></description><category></category></item><item><title><![CDATA[Java多线程之lock原理]]></title><link>https://blog.csdn.net/w1lgy/article/details/122787847</link><guid>https://blog.csdn.net/w1lgy/article/details/122787847</guid><author>w1lgy</author><pubDate>Sun, 06 Feb 2022 01:48:39 +0800</pubDate><description><![CDATA[文章目录一、AQS(AbstractQueuedSynchronizer)AQS的内部实现1、Node的主要属性：2、waitStatus节点的几种状态：3、设置尾节点：4、设置首节点：5、state二、ReentrantLock的实现原理1、lock2、unlock
一、AQS(AbstractQueuedSynchronizer)
Lock之所以能实现线程安全的锁，主要的核心是AQS，AQS提供了一个FIFO队列，可以看做是一个用来实现锁以及其他需要同步功能的框架。AQS的使用依靠继承来完成，子类通过继]]></description><category></category></item><item><title><![CDATA[设计模式之访问者模式]]></title><link>https://blog.csdn.net/w1lgy/article/details/122749966</link><guid>https://blog.csdn.net/w1lgy/article/details/122749966</guid><author>w1lgy</author><pubDate>Sun, 30 Jan 2022 06:23:25 +0800</pubDate><description><![CDATA[文章目录介绍使用场景优缺点优点缺点原理与实现
介绍
在访问者模式（Visitor Pattern）中，我们使用了一个访问者类，它改变了元素类的执行算法。通过这种方式，元素的执行算法可以随着访问者改变而改变。属于行为型模式。根据模式，元素对象已接受访问者对象，这样访问者对象就可以处理元素对象上的操作。
使用场景
1、对象结构中对象对应的类很少改变，但经常需要在此对象结构上定义新的操作。
2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作，而需要避免让这些操作"污染"这些对象的类，也不希望在增加新操作]]></description><category></category></item><item><title><![CDATA[设计模式之迭代器模式]]></title><link>https://blog.csdn.net/w1lgy/article/details/122749942</link><guid>https://blog.csdn.net/w1lgy/article/details/122749942</guid><author>w1lgy</author><pubDate>Sun, 30 Jan 2022 05:57:55 +0800</pubDate><description><![CDATA[文章目录介绍原理迭代器的优势遍历时注意删除和添加新元素的影响
介绍
迭代器模式（Iterator Pattern）是 用于顺序访问集合对象的元素，不需要知道集合对象的底层表示，是一种行为型模式。
本文就以Java中的ArrayList为例来讲解迭代器模式的应用。
原理
一个完整的迭代器模式一般会涉及容器和容器迭代器两部分内容。为了达到基于接口而非实现编程的目的，容器又包含容器接口、容器实现类，迭代器又包含迭代器接口、迭代器实现类。对于迭代器模式，我画了一张简单的类图，你可以看一看，先有个大致的印象。

为了]]></description><category></category></item><item><title><![CDATA[UML教程]]></title><link>https://blog.csdn.net/w1lgy/article/details/122477219</link><guid>https://blog.csdn.net/w1lgy/article/details/122477219</guid><author>w1lgy</author><pubDate>Mon, 24 Jan 2022 18:05:06 +0800</pubDate><description><![CDATA[文章目录UML类图图示样例一、常见UML图_类图1、什么是类图2、类在UML中表示 :3、注释部分：解释说明4、属性部分：4.1、属性语法 : [可见性]属性名[ :类型][ =初始值][{属性字符串}] ;4.2、可见性 ：5、方法部分：5.1、方法语法：[可见性]操作名[( 参数表 )][ : 返回类型][ { 属性字符串 } ]5.2、可见性：6、接口二、类与类，类与接口之间的关系1、继承关系（泛化关系 Generalization）2、实现关系3、依赖关系4、关联关系5、聚合关系6、组合关系三、常见]]></description><category></category></item><item><title><![CDATA[算法：树相关算法题]]></title><link>https://blog.csdn.net/w1lgy/article/details/122295551</link><guid>https://blog.csdn.net/w1lgy/article/details/122295551</guid><author>w1lgy</author><pubDate>Wed, 05 Jan 2022 00:58:31 +0800</pubDate><description><![CDATA[算法：1、判断一棵树是否是镜面树
思路：把树分为左右两棵树，要验证左右两棵树为镜面关系，那么左树的左子树，就和右树的右子树成镜面关系；左树的右子树和右树的左子树成镜面关系，递归判断到最后，如果全部都是镜面关系，那么该树就是镜面树，只要有两个节点不是镜面关系这棵树就不是镜面树。
// 测试链接：https://leetcode.com/problems/symmetric-tree
public class Code03_SymmetricTree {

	public static class TreeNo]]></description><category></category></item><item><title><![CDATA[算法：随机数]]></title><link>https://blog.csdn.net/w1lgy/article/details/122288740</link><guid>https://blog.csdn.net/w1lgy/article/details/122288740</guid><author>w1lgy</author><pubDate>Mon, 03 Jan 2022 18:18:51 +0800</pubDate><description><![CDATA[题目1：已知方法F()能等概率随机返回(50,100)之间的整数，写一个方法能随机等概率返回0和1。
思路：
1、先写一个新方法F1，返回(0,50)的随机数。
2、把（0,50）分为[1.24],25,[26,49]。F1产生的随机数在[1.24]和[26,49]的概率是一样的，所以目标方法F2调用F1如果的结果在[1.24]，就返回0，如果在[26,49]就返回1，如果是25就重新调用F1。
// 此函数只能用，不能修改
	// 等概率返回1~5
	public static int f() {
		r]]></description><category></category></item><item><title><![CDATA[SpringSecurity四：基于SpringSecurity实现QQ登录]]></title><link>https://blog.csdn.net/w1lgy/article/details/116875917</link><guid>https://blog.csdn.net/w1lgy/article/details/116875917</guid><author>w1lgy</author><pubDate>Mon, 17 May 2021 01:25:18 +0800</pubDate><description><![CDATA[文章目录一、原理回顾二、相关接口的了解三、开发获取用户信息的api四、开发QQServiceProvider五、创建QQConnectionFactory及其需要的ApiAdapter1、ApiAdapter2、QQConnectionFactory六、配置类未完待续。。。
一、原理回顾
没看过前面几篇博客的内容可以先看看：
SpringSecurity一：开发基于表单的登录
SpringSecurity二：验证码校验和记住我
SpringSecurity三：OAuth协议和SpringSocial
OAu]]></description><category></category></item><item><title><![CDATA[DDD领域驱动设计五、微服务后前端如何设计]]></title><link>https://blog.csdn.net/w1lgy/article/details/111614865</link><guid>https://blog.csdn.net/w1lgy/article/details/111614865</guid><author>w1lgy</author><pubDate>Thu, 24 Dec 2020 12:49:39 +0800</pubDate><description><![CDATA[文章目录一、微前端的引入二、微前端的集成方式1、微前端与前端主页面的集成2、通用共享业务单元3、团队职责三、微前端的优势1、前端集成简单2、项目职责专一3、隔离和依赖性4、降低沟通和测试成本5、更敏捷地发布6、降低技术敏感性7、高度复用性
一、微前端的引入
现在企业微服务架构都是采用前后端分离的设计方式，后端也是通过微服务把项目拆分为多个小服务并独立部署。那么前端就要应对很多的后端服务，就有很多的api要管理，容易混乱，需要很高的沟通成本和技术要求。当服务出现变更的时候就要通知所有受影响的团队，需要较高的沟]]></description><category></category></item><item><title><![CDATA[DDD领域驱动设计四、分层架构和代码模型]]></title><link>https://blog.csdn.net/w1lgy/article/details/111566243</link><guid>https://blog.csdn.net/w1lgy/article/details/111566243</guid><author>w1lgy</author><pubDate>Wed, 23 Dec 2020 18:45:13 +0800</pubDate><description><![CDATA[一、DDD的分层架构
DDD 分层架构包含用户接口层、应用层、领域层和基础层。通过这些层次划分，我们可以明确微服务各层的职能，划定各领域对象的边界，确定各领域对象的协作方式。。
DDD的分层架构如图：从上到下依次是：用户接口层、应用层、领域层和基础层。
那 DDD 各层的主要职责是什么呢？下面我来逐一介绍一下。
1、用户接口层
用户接口层负责向用户显示信息和解释用户指令。这里的用户可能是：用户、程序、自动化测试和批处理脚本等等。
2、应用层
实现服务组合和编排，适应业务流程快速变化的需求，这一层聚集了应该服]]></description><category></category></item><item><title><![CDATA[DDD领域驱动设计三、用事件风暴构建领域模型]]></title><link>https://blog.csdn.net/w1lgy/article/details/111578725</link><guid>https://blog.csdn.net/w1lgy/article/details/111578725</guid><author>w1lgy</author><pubDate>Wed, 23 Dec 2020 11:37:40 +0800</pubDate><description><![CDATA[文章目录一、准备事件风暴1、参与人员2、环境条件二、确定产品愿景三、业务场景分析四、领域建模五、微服务拆分与设计
我们在上一篇文章中提到过的DDD领域模型的很多概念如通用语言、界限上下文、实体、值对象、聚合、聚合根、领域事件都是通过事件风暴确定的。现在就开始介绍如果用事件风暴构建领域模型。
事件风暴是一项团队活动，领域专家与项目团队通过头脑风暴的形式，罗列出领域中所有的领域事件，整合之后形成最终的领域事件集合，然后对每一个事件，标注出导致该事件的命令，再为每一个事件标注出命令发起方的角色。命令可以是用户发起]]></description><category></category></item></channel></rss>