<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[johnt25的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/johnt25</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; johnt25]]></copyright><item><title><![CDATA[JDK1.8中永久代向元空间转换]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/113101460</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/113101460</guid><author>johnt25</author><pubDate>Mon, 25 Jan 2021 01:58:36 +0800</pubDate><description><![CDATA[转载自https://www.cnblogs.com/paddix/p/5309550.html.



元空间的本质和永久代类似，都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于：元空间并不在虚拟机中，而是使用本地内存。

因此，默认情况下，元空间的大小仅受本地内存限制，但可以通过以下参数来指定元空间的大小：

　　-XX:MetaspaceSize，初始空间大小，达到该值就会触发垃圾收集进行类型卸载，同时GC会对该值进行调整：如果释放了大量的空间，就适当降低该值；如果释放了很少的空.]]></description><category></category></item><item><title><![CDATA[为啥SQLServer到处都要加nolock]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/112857842</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/112857842</guid><author>johnt25</author><pubDate>Wed, 20 Jan 2021 09:38:56 +0800</pubDate><description><![CDATA[转自https://blog.youkuaiyun.com/yangjiechao945/article/details/81355558.



公司.net项目，很多逻辑都是在存储过程中实现，发现查询都添加了WITH (NOLOCK)。

MySQL和SQLServer默认维护事务的机制是不同的，

SQLServer 默认情况下一个事务修改了某个值，在这个事务提交前，是阻塞其他连接来读取这个修改中的值的，如果加nolock读取到的是修改后为提交的值（也就是脏读，因为可能这个值最终会回滚）

MySQL 默认情况.]]></description><category></category></item><item><title><![CDATA[MySQL一条更新语句的执行流程]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/112501657</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/112501657</guid><author>johnt25</author><pubDate>Mon, 11 Jan 2021 23:07:01 +0800</pubDate><description><![CDATA[更新语句的整体流程：


	连接数据库
	
	
	清空当前表对应的所有缓存
	
	
	分析器分析词法和语法
	
	
	优化器决定使用什么索引
	
	
	执行器负责具体执行
	


mysql&gt; update T set c=c+1 where ID=2;
InnoDB引擎部分在执行这个简单的update语句的时候的内部流程：

执行器先找引擎取ID=2这一行。ID是主键，引擎直接用树搜索找到这一行。如果ID=2这一行所在的数据页本来就在内存中，就直接返回给执行器；否则，需要先从磁盘读入内存，然后再返.]]></description><category></category></item><item><title><![CDATA[Redis: 缓存穿透、缓存击穿、缓存雪崩（原因+解决方案）]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/112204671</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/112204671</guid><author>johnt25</author><pubDate>Mon, 04 Jan 2021 21:28:03 +0800</pubDate><description><![CDATA[转自https://www.cnblogs.com/xichji/p/11286443.html.

在我们日常的开发中，都是使用数据库来进行数据的存储，由于一般的系统任务中通常不会存在高并发的情况，所以这样看起来并没有什么问题，可是一旦涉及大数据量的需求，比如一些商品抢购的情景，或者是主页访问量瞬间较大的时候，单一使用数据库来保存数据的系统会因为面向磁盘，磁盘读/写速度比较慢的问题而存在严重的性能弊端，一瞬间成千上万的请求到来，需要系统在极短的时间内完成成千上万次的读/写操作，这个时候往往不是数据库能够承]]></description><category></category></item><item><title><![CDATA[Java BigDecimal 的坑]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/86743478</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/86743478</guid><author>johnt25</author><pubDate>Fri, 01 Feb 2019 17:54:43 +0800</pubDate><description><![CDATA[1. 构造函数的坑


public void constructTest(){

   BigDecimal value1 =new BigDecimal(10.511);
   System.out.println(&quot;value1: &quot; + value1);
   BigDecimal value2 = new BigDecimal(&quot;10.511&quot;);
   System.out.print...]]></description><category></category></item><item><title><![CDATA[BigDecimal数据类型（初始化，加减乘除，基本操作）]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/86743334</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/86743334</guid><author>johnt25</author><pubDate>Fri, 01 Feb 2019 17:49:18 +0800</pubDate><description><![CDATA[BigDecimal为大数据类型，更精准的计算

1.初始化

1.1 字符串做参数 
BigDecimal a =new BigDecimal(“1.22”); 
doublevalue:1.2199999999999999733546474089962430298328399658203125 
1.2 数字做参数 
BigDecimal a =new BigDecimal(1.22); 
c...]]></description><category></category></item><item><title><![CDATA[do...break...while的一个“高级用法”]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/86711242</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/86711242</guid><author>johnt25</author><pubDate>Thu, 31 Jan 2019 09:55:23 +0800</pubDate><description><![CDATA[使用do...break...while简化多级条件判断的结构。

　

如果你写过不少代码，那么一定会不时遇到类似下的情况：

假设要找到文件A，复制该文件为B；然后打开B文件，然后往B文件内写入一些内容；最后在写入成功后，我们需要再进行一些相关操作。

在此过程，遇到以下情况时将放弃后续的操作，认为是操作失败：

１、如果A文件不存在；

２、如果Ｂ文件已经存在,并且询问用户是否覆盖时，用户回...]]></description><category></category></item><item><title><![CDATA[Lambda表达式与匿名内部类的区别分析]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/86178270</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/86178270</guid><author>johnt25</author><pubDate>Wed, 09 Jan 2019 20:55:40 +0800</pubDate><description><![CDATA[一、 匿名内部类
匿名内部类其实就是没有名字的内部类，但是其必须要实现一个接口或者继承一个父类，通常是用来简化代码


例程如下：
先定义一个 IAnimal


public interface IAnimal {
    void run();
    void walk();
}


然后定义测试类 NestedClassTest


public class NestedClassTest...]]></description><category></category></item><item><title><![CDATA[Lambda表达式和匿名内部类]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/86176724</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/86176724</guid><author>johnt25</author><pubDate>Wed, 09 Jan 2019 20:25:02 +0800</pubDate><description><![CDATA[Java8由匿名内部类到lambda表达式的转换，除了具体的语法外，二者之间真正的差别是什么。事实上，lambda表达式有时被错误地称为匿名内部类的“语法糖”，这说的只是二者之间只存在简单的语法上的变化。但实际上，二者之间存在很多显著差异，其中有两点对于程序员来说非常重要：

(1) 匿名内部类表达式会确保创建一个拥有唯一标识的新对象，而lambda表达式的计算机结果可能有，也可能没有唯一标识，这...]]></description><category></category></item><item><title><![CDATA[为什么lambda表达式要用final]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/86176151</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/86176151</guid><author>johnt25</author><pubDate>Wed, 09 Jan 2019 20:20:36 +0800</pubDate><description><![CDATA[为什么 Lambda 表达式(匿名类) 不能访问非 final  的局部变量呢？

因为实例变量存在堆中，而局部变量是在栈上分配，Lambda 表达(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量，可能线程执行时该局部变量已经被销毁了，而 final 类型的局部变量在 Lambda 表达式(匿名类) 中其实是局部变量的一个拷贝。

 

Java 8 的 Lambda 可以捕获...]]></description><category></category></item><item><title><![CDATA[JAVA中replace和replaceAll 区别]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/86175268</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/86175268</guid><author>johnt25</author><pubDate>Wed, 09 Jan 2019 20:02:50 +0800</pubDate><description><![CDATA[1.replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替换(CharSequence即字符串序列的意思,说白了也就是字符串);
2.replaceAll的参数是regex或者char,即基于规则表达式的替换,比如,可以通过replaceAll(&quot;\\d&quot;, &quot;*&quot;)把一个字符串所有的数字字符都换成星号;

相同点是都是全部替换,即把源字符串中的某一字符或...]]></description><category></category></item><item><title><![CDATA[jquery跳出循环 $().each]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/86174230</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/86174230</guid><author>johnt25</author><pubDate>Wed, 09 Jan 2019 19:55:13 +0800</pubDate><description><![CDATA[jquery的循环函数是each()

结束跳出循环：return false， 相当于break；

结束本次循环进入下次循环：return true， 相当于continue。

举例（1）


function MyEach(obj, text) {
    var val = &quot;&quot;;
    
    $(&quot;#option&quot;).each(function(){
        if($(t...]]></description><category></category></item><item><title><![CDATA[javac编译过程]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/81705247</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/81705247</guid><author>johnt25</author><pubDate>Wed, 15 Aug 2018 15:39:15 +0800</pubDate><description><![CDATA[详见：https://blog.youkuaiyun.com/tjiyu/article/details/53748965


       JVM规范定义了Class文件结构格式，但没有定义如何从java程序文件转化为Class文件，所以不同编译器可以有不同实现。



       从javac编译器源码来看，其编译过程可以分为3个子过程：


       1、解析与填充符号表过程：解析主要包括词法分析...]]></description><category></category></item><item><title><![CDATA[ListenableFuture使用场景及介绍示例]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/81392237</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/81392237</guid><author>johnt25</author><pubDate>Fri, 03 Aug 2018 17:59:38 +0800</pubDate><description><![CDATA[ListenableFuture是对原有Future的增强，可以用于监听Future任务的执行状况，是执行成功还是执行失败，并提供响应的接口用于对不同结果的处理。

适用场景：

1、如果一个主任务开始执行，然后需要执行各个小任务，并且需要等待返回结果，统一返回给前端，此时Future和ListenableFuture作用几乎差不多，都是通过get()方法阻塞等待每个任务执行完毕返回。

    ...]]></description><category></category></item><item><title><![CDATA[Java8 Streams 例子]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/81392194</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/81392194</guid><author>johnt25</author><pubDate>Fri, 03 Aug 2018 17:57:37 +0800</pubDate><description><![CDATA[在本教程中，我们将向你展示一些java 8个例子来演示的流filter()，collect()使用，findany()和orelse().

1. Streams filter() and collect()

 

1.1 Java 8之前, 过滤一 List 如下所示 :

BeforeJava8.java



 


	package com.mkyong.java8;
	
	 
	
	i...]]></description><category></category></item><item><title><![CDATA[适配器模式]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/81002247</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/81002247</guid><author>johnt25</author><pubDate>Wed, 11 Jul 2018 16:05:04 +0800</pubDate><description><![CDATA[适配器模式（Adapter Pattern）是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式，它结合了两个独立接口的功能。这种模式涉及到一个单一的类，该类负责加入独立的或不兼容的接口功能。举个真实的例子，读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器，再将读卡器插入笔记本，这样就可以通过笔记本来读取内存卡。主要解决在软件系统中，常常要将一些”现存的对象”放到新的环境...]]></description><category></category></item><item><title><![CDATA[Redis学习之java代码实现（Jedis）]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/80964320</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/80964320</guid><author>johnt25</author><pubDate>Mon, 09 Jul 2018 00:17:23 +0800</pubDate><description><![CDATA[前面两篇说过redis的安装使用和密码设置后，现在来看看怎么用java代码连接服务器，并使用redis。首先项目中需要有redis的驱动包，下载Jedis.jar。下载最新驱动包，放到项目的lib目录下，确保项目包含该驱动包。如果是maven项目，可以直接在pom.xml文件中引入如下配置：&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;redis.clients&amp;lt...]]></description><category></category></item><item><title><![CDATA[long和double类型变量的非原子性问题]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/80835635</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/80835635</guid><author>johnt25</author><pubDate>Wed, 27 Jun 2018 22:01:15 +0800</pubDate><description><![CDATA[“深入java虚拟机”中提到，int等不大于32位的基本类型的操作都是原子操作，但是某些jvm对long和double类型的操作并不是原子操作，这样就会造成错误数据的出现。 错误数据出现的原因是： 对于long和double变量，把它们作为2个原子性的32位值来对待，而不是一个原子性的64位值， 这样将一个long型的值保存到内存的时候，可能是2次32位的写操作， 2个竞争线程想写不同的值到内存的...]]></description><category></category></item><item><title><![CDATA[maven中的install命令]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/80633756</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/80633756</guid><author>johnt25</author><pubDate>Sat, 09 Jun 2018 16:13:16 +0800</pubDate><description><![CDATA[maven通过install将本地工程打包成jar包，放入到本地仓库中，再通过pom.xml配置依赖引入到当前工程。pom.xml中引入的坐标首先在本地maven仓库中查找，若没有则去maven的网上中央仓库查找，并放到本地仓库供项目使用。1. maven的install可以将项目本身编译并打包到本地仓库，这样其他项目引用本项目的jar包时不用去私服上下载jar包，直接从本地就可以拿到刚刚编译打包...]]></description><category></category></item><item><title><![CDATA[Maven项目构建命令compile、test、package]]></title><link>https://blog.youkuaiyun.com/johnt25/article/details/80632426</link><guid>https://blog.youkuaiyun.com/johnt25/article/details/80632426</guid><author>johnt25</author><pubDate>Sat, 09 Jun 2018 13:59:43 +0800</pubDate><description><![CDATA[原文链接：https://blog.youkuaiyun.com/sinat_25926481/article/details/76228160compile前面我们按照maven约束好的文件路径建好项目后，加入pom.xml 在命令行输入mvn compile后，maven就会自动帮我们下载依赖jar，为代码生成字节码文件等。我们把这个过程称为 编译。test前面我们写好测试类，在命令行输入 mvn tes...]]></description><category></category></item></channel></rss>