<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[amy acker的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/amyacker</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; amyacker]]></copyright><item><title><![CDATA[红黑树]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/117003414</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/117003414</guid><author>amyacker</author><pubDate>Tue, 18 May 2021 23:41:24 +0800</pubDate><description><![CDATA[红黑树（英语：Red–black tree）是一种自平衡二叉查找树，是在计算机科学中用到的一种数据结构，典型用途是实现关联数组。它在1972年由鲁道夫·贝尔发明，被称为"对称二叉B树"，它现代的名字源于Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文。红黑树的结构复杂，但它的操作有着良好的最坏情况运行时间，并且在实践中高效
定义

节点是红色或黑色
根是黑色
所有叶子都是黑色（叶子是NIL节点）
每个红色节点必须有两个黑色的子节点（从每个叶子到根的所有路径上不能有两个连.]]></description><category></category></item><item><title><![CDATA[栈帧结构]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/115884873</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/115884873</guid><author>amyacker</author><pubDate>Tue, 20 Apr 2021 04:59:59 +0800</pubDate><description><![CDATA[栈帧
栈帧（Stack Frame）是用于支持虚拟机进行方法调用和方法执行的数据结构，它是虚拟机运行时数据区中的虚拟机栈的栈元素。栈帧存储了方法的局部变量表丶操作数栈丶动态连接和方法返回地址等信息。每一个方法从调用开始至执行完成的过程，都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。对于执行引擎来说，在活动线程中，只有位于栈顶的栈帧才是有效的，称为当前栈帧。与当前栈帧相关联的方法，称为当前方法。

局部变量表
局部变量表（Local Variable Table）是一组变量值存储空间，用于存放方法参数和方]]></description><category></category></item><item><title><![CDATA[虚拟机类加载机制]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/115741597</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/115741597</guid><author>amyacker</author><pubDate>Mon, 19 Apr 2021 00:38:26 +0800</pubDate><description><![CDATA[title: 虚拟机类加载机制
date: 2021-04-15 22:01:58
categories: JVM
tags: JVM

前言
虚拟机类加载机制
概述
虚拟机把描述类的数据从Class文件加载到内存，并对数据进行校验丶转换解析和初始化，最终形成可以被虚拟机直接使用的Java类型，这就是虚拟机的类加载机制。
类加载的时机
类从被加载到虚拟机内存中开始，到卸载出内存为止，它的整个生命周期包括：加载丶验证丶准备丶解析丶初始化丶使用和卸载7个阶段。其中验证丶准备丶解析3个部分统称为连接。
Java.]]></description><category></category></item><item><title><![CDATA[Java Class文件详解]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/114426180</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/114426180</guid><author>amyacker</author><pubDate>Thu, 11 Mar 2021 03:13:30 +0800</pubDate><description><![CDATA[Class类文件的结构
Class文件是一组以8位字节为基础单位的二进制流，各个数据项目严格按照顺序紧凑地排列才Class文件之中，中间没有添加任何分隔符。当遇到需要占用8位字节以上空间的数据项时，则会按照高位在前的方式分隔成若干个8位字节进行存储。
根据Java虚拟机规范的规定，Class文件格式采用一种类似于C语言结构体的伪结构来存储数据，这种伪结构中只有两个数据类型：无符号数和表。
无符号数：属于基本的数据类型，以u1丶u2丶u4丶u8分别代表1个字节丶2个字节丶4个字节丶8个字节的无符号数，无符号数]]></description><category></category></item><item><title><![CDATA[Java 内存分配与回收策略]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/114298206</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/114298206</guid><author>amyacker</author><pubDate>Thu, 04 Mar 2021 04:10:34 +0800</pubDate><description><![CDATA[内存分配
对象的内存分配，往大方向讲，就是在堆上分配（但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配），对象主要分配在新生代的Eden区上，如果启动了本地线程分配缓冲，将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代。
对象优先在Eden分配
大多数情况下，对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时，虚拟机将发起一次Minor GC。

注：Minor GC 和 Full GC有什么不一样吗?
新生代GC（Minor GC）：指发生在新生代的垃圾收集动作，因为]]></description><category></category></item><item><title><![CDATA[Java 垃圾收集器]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/113922913</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/113922913</guid><author>amyacker</author><pubDate>Tue, 02 Mar 2021 02:07:32 +0800</pubDate><description><![CDATA[Serial

]]></description><category></category></item><item><title><![CDATA[Java对象详解]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/113840560</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/113840560</guid><author>amyacker</author><pubDate>Thu, 18 Feb 2021 01:18:34 +0800</pubDate><description><![CDATA[1丶对象的创建
当虚拟机遇到一个new指令时，首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用，并且检查这个符号引用代表的类是否已被加载丶解析和初始化过。如果没有，那么必须先执行相应的类加载过程。
在类加载检查通过后，接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定，为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。假设Java堆中内存是绝对规整的，所有用过的内存都放一边，空闲的内存放别外一边，中间放着一个指针作为分界点的指示器，那所分配的内]]></description><category></category></item><item><title><![CDATA[Java 内存模型与线程]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/113830499</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/113830499</guid><author>amyacker</author><pubDate>Wed, 17 Feb 2021 03:26:18 +0800</pubDate><description><![CDATA[1丶硬件的效率与一致性
由于计算机的存储设备与处理器的运算速度有几个数量级的差距，所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器的运算速度的高速缓存（Cache）来作为内存与处理器之间的缓冲：将运算需要使用到的数据复杂到缓存中，让运算能快速进行，当运算结束后再从缓存同步回内存之中，这样处理器就无须等待缓慢的内存读写了。
基于高速缓存的存储交互很好地解决了处理器与内存的速度矛盾，但是也为计算机系统带来更高的复杂度，因为它引入了一个新的问题：缓存一致性。在多处理器系统中，每个处理器都有自己的高速缓存]]></description><category></category></item><item><title><![CDATA[TCP 三次握手 四次挥手]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/113825608</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/113825608</guid><author>amyacker</author><pubDate>Tue, 16 Feb 2021 17:04:02 +0800</pubDate><description><![CDATA[TCP的连接和建立
TCP报文格式
TCP的连接和建立主要关注报文中的几个字段




字段
长度(bit)
含义




序号
32
TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。


确认号
32
是期望收到对方的下一个报文段的数据的第1个字节的序号，即上次已成功接收到的数据字节序号加1。只有ACK标识为1，此字段有效。


ACK
1
确认号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时，确认号无效。


SYN
1
同步序号]]></description><category></category></item><item><title><![CDATA[TCP报文格式]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/113821154</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/113821154</guid><author>amyacker</author><pubDate>Tue, 16 Feb 2021 04:36:36 +0800</pubDate><description><![CDATA[IP数据报

TCP报文





字段
长度(bit)
含义




源端口
16
源端口，标识哪个应用程序发送。


目的端口
16
目的端口，标识哪个应用程序接收。


序号
32
序号字段。TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。


确认号
32
确认号，是期望收到对方的下一个报文段的数据的第1个字节的序号，即上次已成功接收到的数据字节序号加1。只有ACK标识为1，此字段有效。


数据偏移
4
数据偏移，即首部长度，指出TCP报]]></description><category></category></item><item><title><![CDATA[责任链模式]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/103875157</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/103875157</guid><author>amyacker</author><pubDate>Thu, 04 Feb 2021 15:57:38 +0800</pubDate><description><![CDATA[public abstract class AbstractHandler {

    /**
     * 下一个处理请求
     */
    protected AbstractHandler nextHandler;

    /**
     * 设置下个处理节点
     */
    public void setNextHandle(AbstractHandler nextHa...]]></description><category></category></item><item><title><![CDATA[Java 垃圾回收基础]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/107631986</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/107631986</guid><author>amyacker</author><pubDate>Tue, 28 Jul 2020 11:19:40 +0800</pubDate><description><![CDATA[1丶引用计数算法
引用计数算法的基本思路是就是给对象添加一个引用计数器，每当一个地方引用它时，计数器的值就加1；但引用失效时，计数器的值就减一；任何时刻计数器为0的对象就是不可能再被使用的。
缺点：引用计数算法它很难解决对象之间互相循环引用的问题。
2丶可达性分析算法
可达性分析算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点，从这些节点开始向下搜索，搜索所走过的路径称为引用链，当一个对象到GC Roots没有任何引用链相连时，则证明此对象是不可用的。
即使是不可达的对象，也并非是“非]]></description><category></category></item><item><title><![CDATA[Java JVM内存区域]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/107631762</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/107631762</guid><author>amyacker</author><pubDate>Tue, 28 Jul 2020 11:13:13 +0800</pubDate><description><![CDATA[前言
Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域，根据《Java虚拟机规范》的规定，Java虚拟机所管理的内存将包括以下几个运行时数据区域。
1丶程序计数器
程序计数器是一块较小的内存空间，它可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里，字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令，分支丶循环丶跳转丶异常处理丶线程恢复等基础功能都需要依赖计数器来完成。
由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行]]></description><category></category></item><item><title><![CDATA[java.util.Random 源码解析]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/103855537</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/103855537</guid><author>amyacker</author><pubDate>Tue, 28 Jul 2020 11:08:54 +0800</pubDate><description><![CDATA[public Random() {
    // 生成种子 seedUniquifier方法和System.nanoTime()时间进行 异或运算
    this(seedUniquifier() ^ System.nanoTime());
}

private static final AtomicLong seedUniquifier = new AtomicLong(86825228071...]]></description><category></category></item><item><title><![CDATA[mybatis 拦截器实现 源码解析]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/103828056</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/103828056</guid><author>amyacker</author><pubDate>Tue, 28 Jul 2020 11:05:32 +0800</pubDate><description><![CDATA[@Intercepts —— 表明当前对象是一个Interceptor。
@Signature —— 表明要拦截的接口、方法以及对应的参数类型。

]]></description><category></category></item><item><title><![CDATA[Java8 Stream 流式编程]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/101321595</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/101321595</guid><author>amyacker</author><pubDate>Sat, 25 Jul 2020 21:51:34 +0800</pubDate><description><![CDATA[简介
Java 8 API添加了一个新的抽象称为流Stream，可以让你以一种声明的方式处理数据。
1.创建流
stream() ： 为集合创建串行流
parallelStream() ： 为集合创建并行流
List&lt;String&gt; list = Arrays.asList("A", "B", "C", "D");
// 创建串行流对象
Stream stream = list.str...]]></description><category></category></item><item><title><![CDATA[LRU算法 基于LinkedHashMap实现]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/101239719</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/101239719</guid><author>amyacker</author><pubDate>Tue, 24 Sep 2019 01:13:40 +0800</pubDate><description><![CDATA[简介
LRU是Least Recently Used的缩写，即最近最少使用，常用于页面置换算法，是为虚拟页式存储管理服务的。
核心：如果数据最近被访问过，那么将来访问的几率也更高
利用LinkedHashMap实现
1.利用LinkedHashMap中的构造方法
要完成LRU, accessOrder必须为true
public LinkedHashMap(int initialCapacity,...]]></description><category></category></item><item><title><![CDATA[Java 实现 二叉树]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/100425658</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/100425658</guid><author>amyacker</author><pubDate>Mon, 02 Sep 2019 23:33:30 +0800</pubDate><description><![CDATA[1.定义节点
/**
 *  定义节点
 */
public class BinaryTreeNode {

    private BinaryTreeNode leftChild ; // 左子树

    private BinaryTreeNode rightChild; // 右子树

    private Integer date;

    public BinaryTreeNod...]]></description><category></category></item><item><title><![CDATA[ES6 Map和Set]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/89226561</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/89226561</guid><author>amyacker</author><pubDate>Mon, 15 Apr 2019 11:55:39 +0800</pubDate><description><![CDATA[1.Map
ES6中提供了Map数据结构，是键值对的集合

方法





方法
描述




clear
移除Map对象的所有键/值对


forEach
对映射中的每个元素执行指定操作。


delete
从映射中移除指定的元素


get
返回映射中的指定元素


set
添加一个新建元素到映射


has
如果映射包含指定元素，则返回 true



示例

var m = new Map...]]></description><category></category></item><item><title><![CDATA[《剑指offer》合并两个排序的链表]]></title><link>https://blog.youkuaiyun.com/amyacker/article/details/88989767</link><guid>https://blog.youkuaiyun.com/amyacker/article/details/88989767</guid><author>amyacker</author><pubDate>Wed, 03 Apr 2019 10:37:02 +0800</pubDate><description><![CDATA[输入两个单调递增的链表，输出两个链表合成后的链表，当然我们需要合成后的链表满足单调不减规则。
思路：
假设list1的头节点小于list2的头节点，合并后的链表的头节点必是list1的头节点，同理list2也是一样，比较完头节点之后，再将list1的下一个节点与list2的头节点进行比较，同样小的节点进入合并后的链表，然后再比较，直到两个链表比较完。

递归

public ListNode Me...]]></description><category></category></item></channel></rss>