<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[fanrendale的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/fanrendale</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; fanrendale]]></copyright><item><title><![CDATA[（4）JVM——垃圾回收算法]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/108363508</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/108363508</guid><author>fanrendale</author><pubDate>Wed, 02 Sep 2020 15:44:21 +0800</pubDate><description><![CDATA[本人个人博客网站，欢迎访问：学教府

一、概述
介绍：在程序运行过程中，程序计数器、虚拟机栈、本地方法栈 3 个区域随线程而生，随线程而灭，不用我们关注内存的回收。而 Java 堆和方法区不一样，此处的内存使用和回收是动态的，其中讲垃圾回收主要是在 Java 堆。
二、判断对象需要回收
2.1 引用计数算法
说明：给对象中添加一个引用计数器，没当有一个地方引用它时，计数器值就加 1 ；当引用失效时，计数器值减 1； 任务时刻计数器为 0 的对象就是不可能再被使用的。JVM 没用。
优点：

实现简单
判定.]]></description><category></category></item><item><title><![CDATA[算法——快速排序]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/108363433</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/108363433</guid><author>fanrendale</author><pubDate>Wed, 02 Sep 2020 15:39:40 +0800</pubDate><description><![CDATA[一、简介
步骤如下：

从数列中挑出一个元素，称为 “基准”（pivot）;
重新排序数列，所有元素比基准值小的摆放在基准前面，所有元素比基准值大的摆在基准的后面（相同的数可以到任一边）。在这个分区退出之后，该基准就处于数列的中间位置。这个称为分区（partition）操作；
递归地（recursive）把小于基准值元素的子数列和大于基准值元素的子数列排序；

二、编码如下
/**
 * 快速排序
 *
 * @author xjf
 * @date 2020/8/28 16:08
 */
public c]]></description><category></category></item><item><title><![CDATA[算法——二分查找算法]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/108363376</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/108363376</guid><author>fanrendale</author><pubDate>Wed, 02 Sep 2020 15:37:18 +0800</pubDate><description><![CDATA[一、简介
介绍：二分查找，也称折半搜索，是一种在 有序数组 中 查找某一特定元素 的搜索算法。下面简单介绍其优缺点，以及编码实现。
优点：比较次数少，查找速度快，平均性能好。
缺点：必须有序是数组——因此首先需要排序，而在排序过程中，数组的插入和删除效率是较低的，这就降低了二分法的性能，解决是 平衡二叉树。
二、中间值索引的计算
说明：对应中间值索引的计算有两种算法，分别如下：
// 算法一
int mid = (low + high) / 2;

// 算法二
int mid = low + (high ]]></description><category></category></item><item><title><![CDATA[（3）JVM——对象的创建和内存布局]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/107903344</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/107903344</guid><author>fanrendale</author><pubDate>Mon, 10 Aug 2020 00:34:24 +0800</pubDate><description><![CDATA[一、简介
介绍：在开发中，我们大多是使用 new 关键字来创建对象。但是对于对象的创建具体细节和对象在堆内存中的存储布局不怎么了解，此处主要简单介绍一下。
二、对象的创建
概括：对象的创建过程可以简单描述为如图所示。下面进行具体讲解



类加载检查：当 Java 虚拟机遇到 new 执行时，首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用，并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有，则进行相应的类的加载过程。


分配内存：在类加载检查通过后，就需要为新对象分配内存。对]]></description><category></category></item><item><title><![CDATA[（2）JVM——Java 虚拟机运行时数据区域讲解]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/107828417</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/107828417</guid><author>fanrendale</author><pubDate>Wed, 05 Aug 2020 23:54:39 +0800</pubDate><description><![CDATA[本人个人博客网站，欢迎访问：学教府

一、简述

介绍：如果有了解 C/C++,以及 Java 语言的朋友，肯定知道它们之间最大的差别的就是对于内存的回收。用 C/C++ 时，自己创建的对象得自己回收内存，而 Java 则是因为其自带的垃圾收集器，将开发者解放出来。犹记得当初大学学 C 语言，讲到指针的那一节，就感觉指针是无所不能，各种灵活，不过如果用不好就容易飘。本篇博客主要简单介绍一下 Java 虚拟对于内存的划分，以及大概作用。

二、内存运行时数据区



这张图片展示的就是 JVM 对于内存的经.]]></description><category></category></item><item><title><![CDATA[（1）JVM——在 Ubuntu 上手动编译 OpenJdk12]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/107739406</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/107739406</guid><author>fanrendale</author><pubDate>Mon, 03 Aug 2020 12:41:25 +0800</pubDate><description><![CDATA[一、简述

介绍：最近开始看《深入理解Java虚拟机第三版》，为了自己以后能方便回忆，以及加深理解，特写文章以记之。本篇博客主要是实现使用在 Ubuntu 系统上自己编译 OpenJdk，在后面的学习中会用到。

二、准备工作

安装 Ubuntu 操作系统：我是在 windows 系统上使用 VMware 安装了 Ubuntu 18.04.3 LTS 。这个安装就不介绍了，网上能搜到很多文章，此处贴一个博客地址是首次安装后，实现 root 用户登录以及 ssh 访问：解决Ubuntu18.04不能用Xsh]]></description><category></category></item><item><title><![CDATA[MySQL（1）——数据类型的选择（一）]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/106953321</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/106953321</guid><author>fanrendale</author><pubDate>Thu, 25 Jun 2020 00:21:43 +0800</pubDate><description><![CDATA[一、三个原则

更小的通常更好：在符合条件的情况下，选择最小的数据类型更好。因为它们占用更少的磁盘、内存和 CPU 缓存。
简单就好：简单的数据类型的操作通常需要更少的 CPU 周期。比如，使用整型存储 IP 地址。
尽量避免 NULL：如果查询中包含可为 NULL 的列，对 MySQL 来说更难优化，因为可为 NULL 的列使得索引、索引统计和值比较都更负责。不过一般将 NULL 的列改为非 NULL 性能提升比较小，在对应列建索引时应避免设计为可为 NULL。

二、整数类型

存储整数，可以使用的类型]]></description><category></category></item><item><title><![CDATA[MySQL——定时备份，保留最新31天的数据]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/106631616</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/106631616</guid><author>fanrendale</author><pubDate>Tue, 09 Jun 2020 00:56:18 +0800</pubDate><description><![CDATA[本人个人博客网站，欢迎访问：学教府

一、背景
概述： 对于我们的生产数据库，都需要定时做备份，以免数据丢失。比如每日备份，同时也需要将以前的进行清理。此处我展示的是只保留最新的 31 天数据。
二、备份命令使用

mysqldump 命令是 mysql 可以直接用来进行数据库备份的命令。使用方式如下：# 语法
mysqldump -u&lt;username&gt; -p&lt;password&gt; dbname tablename1 tablename2... &gt; /path/to/***..]]></description><category></category></item><item><title><![CDATA[经验——SpringBoot 获取 resource 目录下的文件]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/106542983</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/106542983</guid><author>fanrendale</author><pubDate>Thu, 04 Jun 2020 11:35:02 +0800</pubDate><description><![CDATA[本人个人博客网站，欢迎访问：学教府

一、背景
介绍： 在业务开发中，我们可能会将几个文件打包成一个压缩文件，而有些文件是固定不变的，可以提前放在资源文件 resource 下面。
这时我们只需要根据相对路径来获取文件。功能看起来很简单，但是遇到的坑倒是不少啊！
二、配置 maven

在文件编译时，需要将 resource 目录下的文件拷贝到 target 目录的 classes 目录下面，这个才是运行时的文件。因为是使用了 maven ，所以此处是在 pom 文件进行配置。如下(只贴出关键点)，这是最.]]></description><category></category></item><item><title><![CDATA[MongoDB——Ubuntu安装及配置带认证的副本集（亲测）]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/106244849</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/106244849</guid><author>fanrendale</author><pubDate>Thu, 21 May 2020 23:18:35 +0800</pubDate><description><![CDATA[一、概述

介绍： 在做 MongoDB 数据备份时，需要进行数据的复制冗余，此时可以用副本集，并且为了传输安全，需要加上认证。

二、生成 keyFile(认证文件)

生成openssl rand -base64 666 &gt; /root/keyfile

说明：①666是文件大小 。②/root/keyfile ： 文件存放路径。 ③该key的权限必须是600；也可改为400
修改权限chmod 600 /root/keyfile 


该认证文件需要复制到每个从主机上。


...]]></description><category></category></item><item><title><![CDATA[Nginx——ubuntu安装Nginx并配置https]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/106183194</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/106183194</guid><author>fanrendale</author><pubDate>Mon, 18 May 2020 00:23:13 +0800</pubDate><description><![CDATA[一、需求
介绍： 我们在部署应用时，希望用到 Nginx ，并配置上 https 。我在网上看了很多文章，感觉都不是很系统。因此写下此文，以备日后使用。
二、安装 Nginx

获取安装包wget http://nginx.org/download/nginx-1.17.10.tar.gz


解压tar -zxvf nginx-1.17.10.tar.gz


配置 with-http_ssl_moudle。很关键./configure --prefix=/usr/local/nginx --with-h]]></description><category></category></item><item><title><![CDATA[Nginx——开启 GZIP 压缩]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/106108042</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/106108042</guid><author>fanrendale</author><pubDate>Wed, 13 May 2020 22:15:16 +0800</pubDate><description><![CDATA[一、作用

Nginx 开启 gzip 压缩，可以实现对静态资源进行压缩，能提高网站运行速度，不过需要配置得当，如果压缩质量设置过高，会给 CPU 造成压力过大。

二、配置和大概解释

配置在 nginx.conf 文件中，对于 gzip 的编写，写在 http 模块下面。# 开启 gzip
gzip on;
# 当返回的内容大于该值时，才会进行 gzip 的压缩，单位是 k。默认为 0，对所有页面压缩
gzip_min_length 1k;
# 设置用于处理请求压缩的缓冲区数量和大小。比如32 4K表示]]></description><category></category></item><item><title><![CDATA[博客——使用 Redis 实现博客编辑的自动保存草稿功能]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/105376719</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/105376719</guid><author>fanrendale</author><pubDate>Wed, 08 Apr 2020 00:03:11 +0800</pubDate><description><![CDATA[一、功能需求
介绍：

在做个人博客网站时。在我们编辑博客时，有可能会突然关闭浏览器或浏览器崩溃的情况，而此时我们的文章才写一半，还没进行保存。如果没有自动保存功能，则此时只能惟有泪千行了。因此需要一个自动保存文章为草稿的功能。
我在此处实现该功能的思路：在前端每隔 3 分钟调用一次自动保存草稿的接口，数据暂存在 Redis 数据库中（有效期设置为 1 天）。这样当我们意外关闭了页面，下次该用户写...]]></description><category></category></item><item><title><![CDATA[fastjson——使用 aop 打印入参，报错：getOutputStream() has already been called for this response]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/104851236</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/104851236</guid><author>fanrendale</author><pubDate>Fri, 13 Mar 2020 22:35:11 +0800</pubDate><description><![CDATA[一、问题描述
我在使用 aop 做日志切面，记录 controller 的入参和返回时，将参数使用 fastjson 格式化。代码如下：
Object[] args = joinPoint.getArgs();

// 报错出现在下面这行
String params = JSONObject.toJSONStringWithDateFormat(args, dateFormat, Serializ...]]></description><category></category></item><item><title><![CDATA[Mybatis 使用经验]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/104740945</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/104740945</guid><author>fanrendale</author><pubDate>Sun, 08 Mar 2020 21:25:04 +0800</pubDate><description><![CDATA[一、Mybatis 中的字符拼接
CONCAT('%',#{param.tagId},'%')

二、注解方式判空
&lt;if test='param.tagId != null and param.tagId != \"\" ' &gt;


]]></description><category></category></item><item><title><![CDATA[Sharding-JDBC 实现分库分表]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/104360255</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/104360255</guid><author>fanrendale</author><pubDate>Mon, 17 Feb 2020 16:59:04 +0800</pubDate><description><![CDATA[一、概述

分库分表介绍：当数据量变大以后，单库单表已经不能满足需求。此时就需要进行拆分，拆分纬度分为垂直拆分和水平拆分。

水平拆分：比如 服务器1 上有 user_0, order_0; 服务器2 上有 user_1, order_1。此时 user_0 和 user_1 一起组成了用户表。
垂直拆分：用户表 放在服务器1上，订单表 放在服务器2上。


此处模拟使用两个数据库，每个数据库建两...]]></description><category></category></item><item><title><![CDATA[Sharding-JDBC + MyBatis-Plus + Druid 实现读写分离（yml方式 和 xml方式）]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/104350362</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/104350362</guid><author>fanrendale</author><pubDate>Sun, 16 Feb 2020 23:03:58 +0800</pubDate><description><![CDATA[一、概述

当业务数据越来越大时，就需要进行分库分表，而 Sharding-JDBC 框架就是能完整的实现分库分表、读写分离和分布式主键等功能。
此处实现读写分离功能。因为是测试，就在同一个 MySQL 中创建两个数据库来模拟。
Sharding-JDBC 的配置方式四种：Java，YAML，Spring命名空间和Spring Boot Starter。此处只讲 YAML 和 XML 方式。

二...]]></description><category></category></item><item><title><![CDATA[Elastic-Job编译部署运维平台 Console]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/104342830</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/104342830</guid><author>fanrendale</author><pubDate>Sun, 16 Feb 2020 15:35:13 +0800</pubDate><description><![CDATA[一、下载源码
从 Elastic-Job 的 github 地址下载源码：https://github.com/elasticjob/elastic-job-lite
二、修改根 pom 文件

需要修改的 pom 文件如下图：

注释掉 pom 文件中的 repositories 和 distributionManagement。如下：



三、使用 maven 进行打包

使用 idea 来...]]></description><category></category></item><item><title><![CDATA[第一篇——Ubuntu 安装 Elasticsearch]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/104293850</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/104293850</guid><author>fanrendale</author><pubDate>Thu, 13 Feb 2020 13:46:14 +0800</pubDate><description><![CDATA[一、创建非 root 用户（es 不能由 root 启动）
sudo adduser xjf

说明：执行命令后会添加密码（必填），以及一些信息（可以直接回车）。之后我们在启动 es 时就登录这个账号
二、使用 wget 下载 Elasticsearch 压缩包

首先创建一个目录来保存压缩包，依次执行：cd /opt
mkdir tools
cd tools
wget https://artif...]]></description><category></category></item><item><title><![CDATA[Activiti6.0——个人开发经验总结]]></title><link>https://blog.youkuaiyun.com/fanrendale/article/details/103824860</link><guid>https://blog.youkuaiyun.com/fanrendale/article/details/103824860</guid><author>fanrendale</author><pubDate>Fri, 03 Jan 2020 18:14:59 +0800</pubDate><description><![CDATA[一、实现驳回效果：使用互斥网关来设置判断条件，驳回时就指向指定的任务节点
二、动态设置审批人：在任务节点上使用JUEL设置一个代理人变量，上一个任务在完成时动态传入该变量的值
三、任务的候选人只有一个人的时候，可以不用候选人机制，只使用代理人就行
四、实现驳回至对应的处理人：

如果上一个任务的节点是一个人，则直接使用代理人变量（不会变）就行，不用重新指定代理人。
如果上一个任务的候选人是一个用户...]]></description><category></category></item></channel></rss>