<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ていひんのブログ]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Introncheng</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Introncheng]]></copyright><item><title><![CDATA[Nginx简介、安装（Linux）与脚本自启动]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/106440157</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/106440157</guid><author>Introncheng</author><pubDate>Sat, 30 May 2020 13:13:19 +0800</pubDate><description><![CDATA[Nginx
  Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件（IMAP/POP3）代理服务器，并在BSD-like 协议下发行，由俄罗斯的程序设计师Igor Sysoev所开发。其特点是占有内存少，并发能力强，并发能力在同类型的网页服务器中表现较好，中国使用Nginx网站用户有：新浪、网易、腾讯等。
Nginx相对于Apache的优点：

轻量级，同样的web服务，比Apache占用更少的内存及资源；
抗并发，Nginx处理请求是异步非阻塞的，而Apache则是阻塞型的，在高并发下ngi]]></description><category></category></item><item><title><![CDATA[JVM层级的内存屏障：JSR内存屏障]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/106144973</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/106144973</guid><author>Introncheng</author><pubDate>Fri, 15 May 2020 16:37:25 +0800</pubDate><description><![CDATA[JSR内存屏障：

LoadLoad：对于这样的语句Load1;LoadLoad;Load2，在Load2及后续的读操作要读取的数据被访问前，保证Load1要读取的数据被读取完毕；
StoreStore：对于这样的语句Store1;StoreStore;Store2，在Store2及后续的写操作执行前，保证Store1的写入操作对其他处理器可见；
LoadStore：对于这样的语句Load1;LoadStore;Store2，在Store2及后续的写入操作被刷出前，保证Load1要读取的数据被读取完毕；
S]]></description><category></category></item><item><title><![CDATA[CPU的乱序执行和合并写技术]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/106144843</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/106144843</guid><author>Introncheng</author><pubDate>Fri, 15 May 2020 16:34:23 +0800</pubDate><description><![CDATA[CPU的乱序执行：
  CPU在进行读等待的同时执行指令，是CPU乱序的根源，这其实不是乱，而是提高效率。例如指令1去内存读数据，因为CPU与内存访问速度相差100倍，如果指令2的执行过程不需要依赖指令1，那么指令2可以先执行，乱序执行的本质是同时执行。Java对象的创建过程不是一个原子操作，极有可能出现指令重排序，下面通过Java对象创建的汇编码讲解。
// 源码：
class T { int num = 8;}
T t = new T();

// 汇编码：
0 new #2 &lt;T&gt;    ]]></description><category></category></item><item><title><![CDATA[存储器层次结构、Cache Line、伪共享、Cache Line对齐]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/106131270</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/106131270</guid><author>Introncheng</author><pubDate>Thu, 14 May 2020 23:37:57 +0800</pubDate><description><![CDATA[存储器的层次结构：
  存储器是分层次的，离CPU越近的存储器，速度越快，每字节的成本越高，同时容量也越小。寄存器速度最快，离CPU最近，成本最高，所以个数容量有限，其次是高速缓存（缓存也是分级，有L1，L2，L3等缓存），再次是主存（普通内存），然后是本地磁盘，最次是远程文件存储。

存储器层次结构





缓存
Register
L1 cache
L2 cache
L3 cache
Main Memory
硬盘




访问时间
&lt; 1ns
约1ns
约3ns
约15ns
约80ns
约2ms
]]></description><category></category></item><item><title><![CDATA[Spring配置元数据的三种方式]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105888197</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105888197</guid><author>Introncheng</author><pubDate>Sat, 02 May 2020 11:24:20 +0800</pubDate><description><![CDATA[1、基于XML文件的配置:
  传统上，配置元数据以简单直观的XML格式提供，如下beans.xml文件中所示：id是标识单个bean定义的字符串，class定义bean的类型，并使用完全限定的类名，可以选择是否配置属性值。
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframewor...]]></description><category></category></item><item><title><![CDATA[Java自定义类加载器（Tomcat类加载器）]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105772191</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105772191</guid><author>Introncheng</author><pubDate>Sun, 26 Apr 2020 16:51:31 +0800</pubDate><description><![CDATA[自定义类加载器：
  因为系统的ClassLoader只会加载指定目录下的class文件,如果你想加载自己的class文件,那么就可以自定义一个ClassLoader。而且我们可以根据自己的需求，对class文件进行加密和解密，自定义类加载器步骤如下：

继承抽象类ClassLoader;
重写findclass(String name)方法；
调用defineClass(String name,...]]></description><category></category></item><item><title><![CDATA[Java类加载机制（类加载器、双亲委派）]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105772067</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105772067</guid><author>Introncheng</author><pubDate>Sun, 26 Apr 2020 16:45:17 +0800</pubDate><description><![CDATA[类加载的时机

创建类的实例：new、反射、反序列化、clone；
访问类中的某个静态变量，或者对静态变量进行赋值；
主动调用类的静态方法；
ClassForName(“包类名”)，得到的class已经初始化完成，ClassLoader.loadClass(“包类名”)得到的class是还没有链接（验证，准备，解析）的;
完成子类的初始化，也会完成对本类的初始化（接口除外）；
该类是程序引导入口（...]]></description><category></category></item><item><title><![CDATA[使用JDOM读取XML文件]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105720446</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105720446</guid><author>Introncheng</author><pubDate>Thu, 23 Apr 2020 23:24:30 +0800</pubDate><description><![CDATA[books.xml：
&lt;?xml version="1.0" encoding="utf-8" ?&gt;
&lt;books&gt;
    &lt;book id="001"&gt;
        &lt;title&gt;Harry Potter&lt;/title&gt;
        &lt;author&gt;J K. Rowling&lt;/author&gt;
     ...]]></description><category></category></item><item><title><![CDATA[观察者模式]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105303122</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105303122</guid><author>Introncheng</author><pubDate>Fri, 03 Apr 2020 22:59:35 +0800</pubDate><description><![CDATA[定义：定义了对相间的一对多依赖，让多个观察者对象同时监听某一个主题对象，当主题对象发生变化时，它的所有观察者都会收到通知并更新。
类型：行为型；
适用场景：关联行为场景、建立一套触发机制；
优点：

观察者和被观察者之间建立一个抽象的耦合；
观察者模式支持广播通信；

缺点：

观察者之间有过多的细节依赖，提高时间消耗及程序复杂度；
使用要适当，要避免循环调用；

观察者模式UML类图：

示例：...]]></description><category></category></item><item><title><![CDATA[责任链模式]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105299990</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105299990</guid><author>Introncheng</author><pubDate>Fri, 03 Apr 2020 19:59:12 +0800</pubDate><description><![CDATA[定义：为请求创建一个接收此次请求对象的链，对该请求对象执行一系列的操作。
类型：行为型；
使用场景：一个请求的处理需要多个对象当中的一个或几个协作处理；
优点：

请求的发送者和接收者（请求的处理）解耦；
责任链可以动态组合；

缺点：

责任链太长或者处理时间过长，影响性能；
责任链有可能过多；

示例：
  本文通过博客（Blog）发布流程中的title、author、type、content...]]></description><category></category></item><item><title><![CDATA[Java自定义注解]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105275998</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105275998</guid><author>Introncheng</author><pubDate>Thu, 02 Apr 2020 18:12:13 +0800</pubDate><description><![CDATA[Java自定义注解
简介：
  Annotation事Java5开始引入的新特征，它提供了一种安全的类似注释的机制，用来将任何的信息和元数据（metadata）与程序元素（类、方法、成员变量等）进行关联。为程序的元素加上更直观的说明，这些说明信息是与程序的业务逻辑无关，并且供指定的工具或框架使用。它是附加在代码中的一些元信息，用于一些工具在编译、运行时进行解析和使用，起到说明、配置的功能。注解不会...]]></description><category></category></item><item><title><![CDATA[Java Stream API]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105257314</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105257314</guid><author>Introncheng</author><pubDate>Wed, 01 Apr 2020 22:15:52 +0800</pubDate><description><![CDATA[简介：
  A sequence of elements supporting sequential and parrallel aggregate operations，Stream是一组用来处理数组、集合的API。
Java8 引入函数式编程的原因：

代码简洁：函数时式编程写出的代码简洁且意图明确，使用Stream接口可以告别for循环，但是性能不一定比for循环好；
多核友好：Java函数...]]></description><category></category></item><item><title><![CDATA[代理模式（静态代理、JDK动态代理、CGLib动态代理、Spring AOP）]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105205297</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105205297</guid><author>Introncheng</author><pubDate>Mon, 30 Mar 2020 18:19:06 +0800</pubDate><description><![CDATA[定义：为其他对象提供一种代理，以控制对这个对象的访问，代理对象在客户端和目标对象之间起到中介的作用；
类型：结构型；
适用场景：

保护代理对象；
增强代理对象；

优点：

将代理对象与真实被调用的目标对象分离；
一定程度上降低了系统耦合度，扩展性好；
保护目标对象；
增强目标对象；

缺点：

代理模式会造成系统设计中目标类增加；
在客户端和目标对象之间增加一个代理对象，相对会造成请求处理速度...]]></description><category></category></item><item><title><![CDATA[ThreadLocal实现原理以及防止内存泄漏]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105152361</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105152361</guid><author>Introncheng</author><pubDate>Fri, 27 Mar 2020 22:44:13 +0800</pubDate><description><![CDATA[  ThreadLocal是一个线程内部的存储类，可以在指定线程内存储数据，数据存储以后，只有指定线程可以得到存储数据。
实现原理：
public class Threadlocal {
    static ThreadLocal&lt;Person&gt; tl = new ThreadLocal&lt;&gt;();
    public static void main(String[] ...]]></description><category></category></item><item><title><![CDATA[Java强软弱虚四种引用]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105151906</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105151906</guid><author>Introncheng</author><pubDate>Fri, 27 Mar 2020 22:20:46 +0800</pubDate><description><![CDATA[  Java有四种引用：强、软、弱、虚，一个变量指向new出来的对象，这就叫一个引用，不同的引用再JVM进行GC时会有不同的表现。如下代码重写了对象的finalize()方法，当该对象被虚拟机GC时，会调用该方法。在平时编程过程中，不能重写该方法，也不要自行调用该方法。
public class M {
    @Override
    protected void finalize() thr...]]></description><category></category></item><item><title><![CDATA[Java栈上分配（逃逸分析、标量替换）]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105149431</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105149431</guid><author>Introncheng</author><pubDate>Fri, 27 Mar 2020 20:21:21 +0800</pubDate><description><![CDATA[  我们通过JVM内存分配可以知道JAVA中的对象都是在堆上进行分配，当对象没有被引用的时候，需要依靠GC进行回收内存，如果对象数量较多的时候，会给GC带来较大压力，也间接影响了应用的性能。为了减少临时对象在堆内分配的数量，JVM通过逃逸分析确定该对象不会被外部访问。那就通过标量替换将该对象分解在栈上分配内存，这样该对象所占用的内存空间就可以随栈帧出栈而销毁，就减轻了垃圾回收的压力。

逃逸分析：...]]></description><category></category></item><item><title><![CDATA[命令模式]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/105045264</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/105045264</guid><author>Introncheng</author><pubDate>Mon, 23 Mar 2020 11:48:15 +0800</pubDate><description><![CDATA[定义：将“请求”封装成对象，以便使用不同的请求，命令模式解决了应用程序中对象的职责以及他们之间的通信方式；
类型：行为型；
适用场景：

请求调用者和请求接收者需要接耦，使得使用者和接收者不直接交互；
需要抽象出等待执行的行为；

优点：

降低耦合；
容易扩展新命令或者一组命令；

缺点：

命令的无限扩展会增加类的数量，提高系统实现复杂度；

课程命令举例：
// 课程类
public cla...]]></description><category></category></item><item><title><![CDATA[Java锁升级过程]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/104865515</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/104865515</guid><author>Introncheng</author><pubDate>Sat, 14 Mar 2020 18:47:29 +0800</pubDate><description><![CDATA[markword实现表：
  Java对象头里的markword主要存储虚拟机有关该对象的运行数据，如hashcode、gc年龄和锁信息，实现表如下图所示：
  markword中最低的三位代表锁状态 其中1位是偏向锁位 两位是普通锁位。
锁升级过程：

当一个Java对象被new出来，markword最低的三位为：001，表示无锁态；

Obiect o = new Object();


当对...]]></description><category></category></item><item><title><![CDATA[Java对象内存布局]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/104832305</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/104832305</guid><author>Introncheng</author><pubDate>Fri, 13 Mar 2020 00:36:49 +0800</pubDate><description><![CDATA[  在Java虚拟机中，每一个Java对象都由标记字段（markword）、类型指针（class pointer）、实例数据（instance data）和内存对齐（padding）构成，数组对象还有数组长度（length，4字节）。markword里主要存储虚拟机有关该对象的运行数据，如hashcode、gc年龄和锁信息；class pointer则是表示该对象属于什么class；instanc...]]></description><category></category></item><item><title><![CDATA[操作系统学习笔记（进程、线程、CPU调度、死锁）]]></title><link>https://blog.youkuaiyun.com/Introncheng/article/details/104644614</link><guid>https://blog.youkuaiyun.com/Introncheng/article/details/104644614</guid><author>Introncheng</author><pubDate>Tue, 03 Mar 2020 23:29:33 +0800</pubDate><description><![CDATA[1、进程与线程
进程：

父进程先创建，子进程后创建，但是子进程先死亡，因为子进程可能需要共享父进程的资源；
进程中止原因：进程结束、进程终止、内存清除；
生产者-消费者：生产者进程是产生数据的进程，在硬盘中读取数据到内存；中间线程将缓冲区1的数据解压到缓冲区2；消费者进程是消费数据的进程，将缓冲区2将数据显示；
生产者消费者一定是时间片轮转，不是批处理，否则会陷入无尽的等待；
原语：执行过程中不...]]></description><category></category></item></channel></rss>