<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[aa1358075776的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/aa1358075776</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; aa1358075776]]></copyright><item><title><![CDATA[想理解Java的IO，不要从操作系统开始说起的都是耍流氓]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/107317072</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/107317072</guid><author>aa1358075776</author><pubDate>Sun, 18 Sep 2022 18:03:43 +0800</pubDate><description><![CDATA[Java网络IO涵盖的知识体系很广泛，本文将简单介绍Java网络IO的相关知识

从操作系统开始

为了保护操作系统的安全，会将内存分为用户空间和内核空间两个部分。如果用户想要操作内核空间的数据，则需要把数据从内核空间拷贝到用户空间。

举个栗子，如果服务器收到了从客户端过来的请求，并且想要进行处理，那么需要经过这几个步骤：

服务器的网络驱动接收到消息之后，向内核申请空间，并在收到完整的数据包（这个过程会产生延时，因为有可能是通过分组传送过来的）后，将其复制到内核空间；
	数据从内核空间拷贝到用户空间；.]]></description><category></category></item><item><title><![CDATA[查看使用的网卡是否打满]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/114362789</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/114362789</guid><author>aa1358075776</author><pubDate>Thu, 04 Mar 2021 10:45:17 +0800</pubDate><description><![CDATA[1、查看Linux系统有几块网卡
一般系统默认都有4个,无所谓了管它几个呢~

[root@db25440 ~]# ifconfig -a
eth0   Link encap:Ethernet HWaddr D4:BE:D9:AA:30:18 
     inet addr:10.255.254.40 Bcast:10.255.255.255 Mask:255.255.240.0
     inet6 addr: fe80::d6be:d9ff:feaa:3018/64 S...]]></description><category></category></item><item><title><![CDATA[InnoDB 对比 MyISAM]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/114068938</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/114068938</guid><author>aa1358075776</author><pubDate>Thu, 25 Feb 2021 11:24:50 +0800</pubDate><description><![CDATA[区别：

1. InnoDB支持事务，MyISAM不支持，对于InnoDB每一条SQL语言都默认封装成事务，自动提交，这样会影响速度，所以最好把多条SQL语言放在begin和commit之间，组成一个事务；

2. InnoDB支持外键，而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败；

3. InnoDB是聚集索引，使用B+Tree作为索引结构，数据文件是和（主键）索引绑在一起的（表数据文件本身就是按B+Tree组织的一个索引结构），必须要有主键，通过主键索引效率很高。但是..]]></description><category></category></item><item><title><![CDATA[7.对象]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/112556179</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/112556179</guid><author>aa1358075776</author><pubDate>Wed, 13 Jan 2021 11:10:36 +0800</pubDate><description><![CDATA[  我们知道redis所有的主要数据结构：比如简单动态字符串、双端链表、字典、压缩列表、整数集合、 跳表。Redis并没有直接使用这些数据结构来实现键值对数据库，而是基于这些数据结构创建了一个对象系统，这个系统包含字符串对象，列表对象、哈希对象、集合对象、有序集合对象。
对象的类型及编码
  Redis中的每个对象都是由一个redisObject结构表示
typedef struct redisObject{
    //类型
    unsigned type:4;
    
    //编码
    u]]></description><category></category></item><item><title><![CDATA[6.跳跃表]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/112389355</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/112389355</guid><author>aa1358075776</author><pubDate>Sat, 09 Jan 2021 11:27:28 +0800</pubDate><description><![CDATA[  跳跃表是一种有序数据结构，它通过在每个节点中维持多个指向其他节点的指针，从而达到快速访问节点的目的。
  跳跃表支持平均O(logN)、最坏O(N)复杂度的节点查找，还可以通过顺序性操作来批量处理节点。
跳跃表的实现
  Redis的跳跃表由redis.h/zskiplistNode和redis.h/zskiplist两个结构定义，其中zskiplistNode结构用于表示跳跃表节点，而zskiplist结构则用于保存跳跃表节点的相关信息，比如节点的数量，以及指向表头节点和表尾节点的指针等等。
zski]]></description><category></category></item><item><title><![CDATA[压缩列表]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/112389237</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/112389237</guid><author>aa1358075776</author><pubDate>Sat, 09 Jan 2021 11:18:56 +0800</pubDate><description><![CDATA[  压缩列表（ziplist）是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项，并且每个列表项要么就是小整数值，要么就是长度比较短的字符串，那么redis就会使用压缩列表来做列表键的底层实现。
压缩列表的构成
  压缩列表是Redis为了节约内存而开发的，由一系列特殊编码的连续内存组成的顺序型数据结构。




zlbytes
zltail
zllen
entry1
entry2
…
entryN
zlend







zlbytes
zltail
zllen
entry1




zlby]]></description><category></category></item><item><title><![CDATA[简单动态字符串SDS]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/112388601</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/112388601</guid><author>aa1358075776</author><pubDate>Sat, 09 Jan 2021 10:39:36 +0800</pubDate><description><![CDATA[  Redis没有直接使用C语言传统的字符串表示（以空字符串结尾的字符数组，以下简称C字符串），而是构建了一种名为简单动态字符串的抽象类型，并将SDS用作redis的默认字符串表示。在redis里面，C字符串只会用在一些无需修改的地方，比如打印日志。
SDS的定义
  每个sds.h/sdshdr结构表示一个SDS值：
struct sdshdr{
    //记录buf数组中已使用字节的数量，等于sds所保存字符串的数量
    int len;
    //记录buf数组中未使用字节的数量
    in]]></description><category></category></item><item><title><![CDATA[字典]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/112387989</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/112387989</guid><author>aa1358075776</author><pubDate>Sat, 09 Jan 2021 09:59:19 +0800</pubDate><description><![CDATA[字典中的每个键都是独一无二的。
结构
typedef struct dictht{
    dictEntry **table;
    
    unsigned long size;
    
    unsigned long sizemask = size -1;
    
    // 该hash表已有的节点数量
    unsigned long used;
} dictht;


typedef struct dictEntry{
    void *key;
    
    union{
]]></description><category></category></item><item><title><![CDATA[Java非静态内部类]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/110180478</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/110180478</guid><author>aa1358075776</author><pubDate>Thu, 26 Nov 2020 11:15:22 +0800</pubDate><description><![CDATA[Java非静态内部类

在java中内部类主要分为成员内部类（非静态内部类、静态内部类）、匿名内部类、局部内部类
接下来我要说的是以下这种内部类，非静态内部类。首先了解非静态内部类的定义。

非静态内部类：
1.非静态内部类必须寄存在一个外部类对象里。因此，如果有一个非静态内部类对象那么一定存在对应的外部类对象。
非静态内部类对象单独属于外部类的某个对象
2.非静态内部类可以直接访问外部类的成员，但是外部类不能直接访问非静态内部类成员
3.非静态内部类不能有静态方法、静态属性、静态初始化块
4.外部类的静态]]></description><category></category></item><item><title><![CDATA[大佬问我: notify()会立刻释放锁么?]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/109673996</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/109673996</guid><author>aa1358075776</author><pubDate>Fri, 13 Nov 2020 14:22:54 +0800</pubDate><description><![CDATA[大佬问我: notify()会立刻释放锁么?

​





我的内心戏: 肯定会啊! 这么简单的问题?



image

聪明如我, 决定装小白, 回答: 不会?

大佬: 很好, 小伙子基础不错!





我:



image

大佬: 说说为什么





我: ………………



image

于是, 有了这篇文章!

问题的根本原来在于 “立刻”这个描述词!

如果你和咸鱼君一样懵逼, 不妨往下看!

技术大佬可以告辞了!!

接下来, 我们深入的分析分析wait和notify
...]]></description><category></category></item><item><title><![CDATA[《Scalable IO in Java》译文]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/109668726</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/109668726</guid><author>aa1358075776</author><pubDate>Fri, 13 Nov 2020 09:55:12 +0800</pubDate><description><![CDATA[Scalable IO in Java》 是java.util.concurrent包的作者，大师Doug Lea关于分析与构建可伸缩的高性能IO服务的一篇经典文章，在文章中Doug Lea通过各个角度，循序渐进的梳理了服务开发中的相关问题，以及在解决问题的过程中服务模型的演变与进化，文章中基于Reactor反应器模式的几种服务模型架构，也被Netty、Mina等大多数高性能IO服务框架所采用，因此阅读这篇文章有助于你更深入了解Netty、Mina等服务框架的编程思想与设计模式。

下面是我对《Scalab]]></description><category></category></item><item><title><![CDATA[初识Netty原理(三)——解码和编码]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/109484655</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/109484655</guid><author>aa1358075776</author><pubDate>Wed, 04 Nov 2020 10:00:19 +0800</pubDate><description><![CDATA[在Netty底层读入的是ByteBuf二进制数据，在实际开发中，需要将它解码为Java的POJO对象，处理完业务后，需要将Java的POJO对象编码为ByteBuf二进制数据放进通道中进行传输。这里就需要使用到Netty的解码器和编码器。

Decoder原理和使用

原理

Netty中的解码器都直接或间接地实现了入站处理适配器，所以在使用时，直接继承解码器就行，而不需要再去实现处理适配器。
在继承解码器的时候需要重写decode方法（在父类中是个抽象方法），在decode方法里实现具体的解码过程。Net]]></description><category></category></item><item><title><![CDATA[FileOutputStream 和 FileInputStream]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/109136132</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/109136132</guid><author>aa1358075776</author><pubDate>Sat, 17 Oct 2020 17:50:22 +0800</pubDate><description><![CDATA[import java.io.*;
 
public class fileStreamTest2 {
    public static void main(String[] args) throws IOException {
 
        File f = new File("a.txt");
        FileOutputStream fop = new FileOutputStream(f);
        // 构建FileOutputStream对象,文件不存在会自动新建
 
 .]]></description><category></category></item><item><title><![CDATA[JAVA学习脚印10:解惑java 中UTF-16与char]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/109104571</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/109104571</guid><author>aa1358075776</author><pubDate>Thu, 15 Oct 2020 20:18:01 +0800</pubDate><description><![CDATA[JAVA学习脚印10:解惑java 中UTF-16与char

java中的char、utf-16编码、代码点、代码单元等概念，做一个了解还是有必要的。

1.基本概念

1) Java的字符类型和字符串类型



字符类型采用的是UTF-16编码方式对Unicode编码表进行表示。其中一个char类型固定2字节,为无符号数，表示范围为'\u0000'(0)~'\uffff'(65,535)。

java中的String定义如下:

public final class String
 imple...]]></description><category></category></item><item><title><![CDATA[Mybatis----Cache（缓存模块） 源码解析]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/108820873</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/108820873</guid><author>aa1358075776</author><pubDate>Tue, 29 Sep 2020 14:21:57 +0800</pubDate><description><![CDATA[一、Cache简介

   MyBatis作为一个强大的持久层框架，缓存是其必不可少的功能。MyBatis中的缓存是分为两层结构的，分为一级缓存和二级缓存，但是本质上是相同的，他们使用的都是Cache接口的实现。

二、Cache继承结构

   

接下来会逐个介绍每个类的作用和主要字段及实现方法

三、Cache的实现类

1、Cache接口

   


  /**
   * @return 该实例的唯一标识符
   */
  String getId();

  /**
  ...]]></description><category></category></item><item><title><![CDATA[Mybatis子查询 column={} 时sql异常]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/108797504</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/108797504</guid><author>aa1358075776</author><pubDate>Fri, 25 Sep 2020 15:22:43 +0800</pubDate><description><![CDATA[1.使用子查询时，当子查询的sql的 parameterType=int，association的 column={} 时会报异常

Caused by: java.lang.NoSuchMethodException: java.lang.Integer.&lt;init&gt;()



2.原因：是因为{}被解析为map，子查询语句会从parameterType中拿map中的key，导致解析异常
...]]></description><category></category></item><item><title><![CDATA[openzipkin/brave初步了解]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/108766328</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/108766328</guid><author>aa1358075776</author><pubDate>Thu, 24 Sep 2020 09:42:47 +0800</pubDate><description><![CDATA[一、brave是什么？

     github链接：https://github.com/openzipkin/brave/tree/master/instrumentation

     brave是zipkin提供的链路跟踪的组件，支持服务间的各种调用的路径跟踪，支持htttp的同步异步调用跟踪，dubbo，kafka、rabbit等消息的链路跟踪：

    

二、HTTP、kafka的链路跟踪的实现原理

      都是通过请求头或消息头的方式，...]]></description><category></category></item><item><title><![CDATA[类加载机制]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/108681619</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/108681619</guid><author>aa1358075776</author><pubDate>Sat, 19 Sep 2020 17:49:05 +0800</pubDate><description><![CDATA[一.类生命周期

1.加载

   读取二进制内容

2.验证

   验证class文件格式规范、语义分析、引用验证、字节码验证

3.准备

   分配内存、设置类static修饰的变量初始值

4、解析

   类、接口、字段、类方法解析

5、初始化

   为静态变量赋值；执行静态代码块

6、使用

   创建实例对象

7、卸载

二、类加载器

1.Boostrap loader

   C/C++实现，无对应的java类：null。加载JRE_H...]]></description><category></category></item><item><title><![CDATA[JVM常用内存参数配置]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/108677953</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/108677953</guid><author>aa1358075776</author><pubDate>Sat, 19 Sep 2020 10:34:03 +0800</pubDate><description><![CDATA[一、 常用参数

　　-Xms

　　JVM启动时申请的初始Heap值，默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时，JVM会减小heap的大小到-Xms指定的大小，可通过-XX:MaxHeapFreeRation=来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同值，避免每次垃圾回收完成后JVM重新分配内存；开发测试机JVM可以保留默认值。(例如：-Xms4g)

　　-Xmx

　　JVM可申请的最大Heap值，默认值为物理内存的1/4但小于1G，...]]></description><category></category></item><item><title><![CDATA[java的常量池在堆中]]></title><link>https://blog.youkuaiyun.com/aa1358075776/article/details/108651588</link><guid>https://blog.youkuaiyun.com/aa1358075776/article/details/108651588</guid><author>aa1358075776</author><pubDate>Thu, 17 Sep 2020 19:52:01 +0800</pubDate><description><![CDATA[public class StringPoolTest {



        public static void main(String[] args) {
            String str = "abc";
            char[] arrays = {'a', 'b', 'c'};
            String str2 = new String(arrays);
            str2 = str2.intern();
            S...]]></description><category></category></item></channel></rss>