<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[HeloJ的博客]]></title><description><![CDATA[编程学院 Jara系一班]]></description><link>https://blog.youkuaiyun.com/danadreamer</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; danadreamer]]></copyright><item><title><![CDATA[内存溢出、泄漏]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116566761</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116566761</guid><author>danadreamer</author><pubDate>Sun, 09 May 2021 16:43:00 +0800</pubDate><description><![CDATA[1. 内存泄漏

程序无法释放已申请的内存空间

1.1 声明静态的集合类

如：private static Map&lt;String&gt; map = new HashMap();

它们的生命周期与应用程序的生命周期相同，容易导致OOM。

1.2 ThreadLocal未主动remove

ThreadLocal使用弱引用作为key，当ThreadLocal不存在外部强引用时，key会被GC回收，就导致key为null，value还存在强引用，只有在线程结束时，value的强引用才会断掉

1.]]></description><category></category></item><item><title><![CDATA[垃圾收集器]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116566709</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116566709</guid><author>danadreamer</author><pubDate>Sun, 09 May 2021 16:42:12 +0800</pubDate><description><![CDATA[1. Serial收集器



是一个单线程垃圾收集器，垃圾收集过程过程中会STW，新生代使用标记-复制算法，老年代使用标记-整理算法。

启动参数：-XX:+/-UseSerialGC，可应用于客户端模式下虚拟机。

2. ParNew收集器



Serial收集器的多线程版本，能与CMS收集器配合工作。

老年代使用CMS后（-XX:+/-UseConcMarkSweepGC），新生代模式使用ParNew。

启动参数：-XX:+/-UseParNewGC(JDK9取消)，默认开启收集线程数...]]></description><category></category></item><item><title><![CDATA[HotSpot算法细节]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116566686</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116566686</guid><author>danadreamer</author><pubDate>Sun, 09 May 2021 16:39:04 +0800</pubDate><description><![CDATA[1. 根节点枚举

类加载完成后，HotSpot使用一组OopMap数据结构来记录对象内对应偏移量上对应的数据类型，在即时编译过程中，也会在特定位置记录下栈里和寄存器里哪些位置是引用。这样，垃圾收集器在进行GC Roots扫描时就不要从方法区等GC Roots开始查找，优化引用链构建效率。

OopMap会带来其他问题：如果每条指令都生成OopMap将需要大量额外的空间，此时引出了安全点。

2. 安全点

安全点主要针对程序获取CPU时间片，执行进行垃圾收集的情况。

HotSpot只在安全点位置才会生成]]></description><category></category></item><item><title><![CDATA[垃圾收集算法]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116566657</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116566657</guid><author>danadreamer</author><pubDate>Sun, 09 May 2021 16:38:00 +0800</pubDate><description><![CDATA[1. 分代收集理论

分代收集理论建立在两个分代假说之上：

弱分代假说：绝大多数对象都是朝生夕灭的。
	强分代假说：熬过越多次垃圾收集过程的对象就越难以消亡。
2. 标记-清除算法



最基础的垃圾收集算法，分为标记和清除两个阶段

标记出所有需要回收的对象
	标记完成后，统一回收掉所有被标记的对象
此算法主要缺点有两个：

执行效率不稳定

	如果Java堆中包含大量需回收的对象，标记和清除的执行效率将降低
	
	内存空间碎片化
	清除之后产生大量不连续的内存碎片，导致后期分配较大对象时无法找到足够内]]></description><category></category></item><item><title><![CDATA[对象存活判定]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116566633</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116566633</guid><author>danadreamer</author><pubDate>Sun, 09 May 2021 16:35:59 +0800</pubDate><description><![CDATA[1. 引用计数算法

在对象中添加一个引用计数器，

每当有一个地方引用它时，计数器就加一；

当引用失效时，计数器值就减一；

任何时刻计数器为零的对象就是不可能再被使用的。

缺点：无法解决对象之间相互循环引用的问题

2. 可达性分析算法

从GC Roots到对象不可达时，则此对象不可能再被使用

GCRoots对象：

虚拟机栈中引用的对象，如：各个线程被调用的方法堆栈中使用到的参数、局部变量、临时变量等
	方法区中类静态属性引用的对象，如：Java类的引用类型静态变量
	方法区中常量引用的对象，]]></description><category></category></item><item><title><![CDATA[对象访问定位]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116566618</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116566618</guid><author>danadreamer</author><pubDate>Sun, 09 May 2021 16:34:52 +0800</pubDate><description><![CDATA[Java程序会通过栈帧中的reference数据来操作堆上的具体对象，主流的对象访问方式有两种：

使用句柄访问
	直接指针访问
1. 使用句柄

Java堆中可能会划分处一块内存来作为句柄池，reference中存储的就是对象的句柄地址，而句柄包含了对象实例数据与类型数据各自具体的地址信息。



优点：对象被移动时只会改变句柄中实例数据指针，reference本身无需更改

2. 直接指针

reference中存储对象地址，HotSpot使用此种访问方式



优点：访问速度快，节省一次指针定位的时间]]></description><category></category></item><item><title><![CDATA[对象内存布局]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116566588</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116566588</guid><author>danadreamer</author><pubDate>Sun, 09 May 2021 16:34:12 +0800</pubDate><description><![CDATA[在HotSpot虚拟机中，对象在堆内存中的存储布局可以划分为三个部分：

对象头
	实例数据
	对齐填充
1. 对象头

对象头包含一般包含两类信息，数组对象包含三类信息

1.1 存储对象自身的运行时数据（Mark Word）



如：哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向锁ID、偏向时间戳等

1.2 类型指针（Klass）

类型指针指对象指向它的类型元数据的指针，Java虚拟机通过这个指针来确定该对象是哪个类的实例。

1.3 数组长度

仅数组对象包含，主要用来虚拟机通过普通Jav]]></description><category></category></item><item><title><![CDATA[对象创建流程]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116566555</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116566555</guid><author>danadreamer</author><pubDate>Sun, 09 May 2021 16:32:44 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[内存模型]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116566440</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116566440</guid><author>danadreamer</author><pubDate>Sun, 09 May 2021 16:29:19 +0800</pubDate><description><![CDATA[1. 程序计数器

程序计数器是一块较小的内存空间，可以看做是当前线程所执行的字节码的行号指示器。

各条线程之间程序计数器互不影响，独立存储，即：线程私有。

如果执行一个Java方法，程序计数器记录正在执行的虚拟机字节码指令的地址；

如果执行一个Native方法，程序计数器记录为空（Undefined）。

《Java虚拟机规范》未对此内存区域规定任何OOM情况。

2. Java虚拟机栈

Java虚拟机栈是线程私有的，生命周期与线程相同。

虚拟机栈描述的是Java方法执行的线程内存模型：每个..]]></description><category></category></item><item><title><![CDATA[职责链模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116427062</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116427062</guid><author>danadreamer</author><pubDate>Fri, 07 May 2021 21:10:12 +0800</pubDate><description><![CDATA[1. 类图



Handler：定义职责的接口，通常定义处理请求的方法，可以在此处实现后继链
	ConcreteHandler：实现职责的类，对职责范围内请求的处理，对职责范围外请求的转发
	Client：客户端，向链上的具体处理对象提交请求，让职责链负责处理
2. 示例


分离职责，动态组合


2.1 职责接口


public abstract class Handler {
    // 持有后继的职责对象
    protected Handler handler;

    public v]]></description><category></category></item><item><title><![CDATA[命令模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116427035</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116427035</guid><author>danadreamer</author><pubDate>Fri, 07 May 2021 21:09:56 +0800</pubDate><description><![CDATA[1. 类图



Command：命令接口，声明执行的方法
	ConcreteCommand：命令接口实现，持有并调用接收者的功能
	Receiver：接收者，执行命令的对象
	Invoker：要求命令对象执行请求，通常持有命令对象
	Client：创建具体的命令对象，并设置命令对象的接收者
2. 示例


将请求封装成对象


2.1 命令接口


public interface Command {
    void execute();
}

2.2 命令实现


持有命令真正执行的对象



pub]]></description><category></category></item><item><title><![CDATA[解释器模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116427011</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116427011</guid><author>danadreamer</author><pubDate>Fri, 07 May 2021 21:09:31 +0800</pubDate><description><![CDATA[1. 类图



AbstractExpression：解释器接口
	TerminalExpression：终结符解释器，解析句子的结束符
	NonterminalExpression：非终结符解释器，用来实现语法规则中非终结符相关的操作。可以有多种非终结符解释器
	Context：上下文，通常包含各个解释器需要的数据或是公共的功能
	Client：使用解释器的客户端，按照语言的语法表达式转换成使用解释器对象描述的抽象语法树，然后调用解释操作
2. 示例


解释器对给定语法的句子进行解析


对字符串​1]]></description><category></category></item><item><title><![CDATA[迭代器模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116422893</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116422893</guid><author>danadreamer</author><pubDate>Fri, 07 May 2021 21:09:09 +0800</pubDate><description><![CDATA[1. 类图



Iterator：迭代器接口。定义访问和遍历元素的接口
	ConcreteIterator：迭代器实现类。实现对聚合对象的遍历，并跟踪遍历时的当前位置
	Aggregate：聚合对象。定义创建相应迭代器对象的接口
	ConcreteAggregate：聚合对象实现。实现创建相应的迭代器对象
2. 示例


统一访问聚合元素的方法


2.1 迭代器接口


public interface Iterator {
    void first();
    void next();
    ]]></description><category></category></item><item><title><![CDATA[中介者模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116422873</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116422873</guid><author>danadreamer</author><pubDate>Thu, 06 May 2021 10:05:24 +0800</pubDate><description><![CDATA[1. 类图



Mediator：中介者接口。定义各个同事之间交互需要的方法
	ConcreteMediator：中介者实现。了解和维护各个同事，并负责协调同事间的交互关系
	Colleague：同事类父类，通常为抽象类。主要负责约束同事对象的类型，并实现一些具体同事类之间的公共功能
	ConcreteColleague：具体的同事类，需要与其他同事通信时，就持有中介者通信
2. 示例


将多个对象之间的交互统一封装


2.1 中介者接口


public interface Mediator {
 ]]></description><category></category></item><item><title><![CDATA[访问者模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116422852</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116422852</guid><author>danadreamer</author><pubDate>Thu, 06 May 2021 10:05:06 +0800</pubDate><description><![CDATA[1. 类图



Visitor：访问者接口，为所有访问者声明一个方法，用来代表对对象结构添加的功能
	ConcreteVisitor：具体访问者，实现添加的功能
	Element：元素对象，对象结构的顶层接口，定义接收访问的操作
	ConcreteElement：具体元素对象，回调访问者的真实功能，开放自身的数据供访问者使用
	ObjectStructure：对象结构，包含多个被访问的对象
2. 示例


为可能扩展的对象预留回路，通过回调的方式进行功能扩展，避免对对象的修改


2.1 现有对象抽象类
]]></description><category></category></item><item><title><![CDATA[模板方法模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116422843</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116422843</guid><author>danadreamer</author><pubDate>Thu, 06 May 2021 10:04:49 +0800</pubDate><description><![CDATA[1. 类图



AbstractClass：抽象类。定义算法骨架和抽象操作
	ConcreteClass：具体实现类。实现抽象类中的抽象操作
2. 示例


父类固定算法框架，子类父子框架内部实现


2.1 对象实体


public class LoginModel {
    private String username;
    private String password;

    public String getUsername() {
        return username;]]></description><category></category></item><item><title><![CDATA[策略模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116422831</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116422831</guid><author>danadreamer</author><pubDate>Thu, 06 May 2021 10:04:27 +0800</pubDate><description><![CDATA[1. 类图



Context：上下文，和具体的策略类交互
	Strategy：策略接口，约束一系列具体的策略算法
	ConcreteStrategy：具体策略算法实现
2. 示例


分离算法，选择实现，算法可任意替换


2.1 策略接口


public interface Strategy {
    double calcPrice(double price);
}

2.2 策略实现


public class NormalCustomerStrategy implements Strate]]></description><category></category></item><item><title><![CDATA[状态模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116422811</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116422811</guid><author>danadreamer</author><pubDate>Thu, 06 May 2021 10:04:07 +0800</pubDate><description><![CDATA[1. 类图



Context：上下文，封装不同的状态
	State：封装与上下文的一个特定状态所对应的行为
	ConcreteState：具体的状态处理类
2. 示例


根据状态分离和选择行为


2.1 上下文


public class VoteContext {

    // 存放投票结果
    private Map&lt;String,String&gt; resultMap = new HashMap&lt;&gt;();
    // 存放投票次数
    private Map&]]></description><category></category></item><item><title><![CDATA[观察者模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116422780</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116422780</guid><author>danadreamer</author><pubDate>Thu, 06 May 2021 10:03:38 +0800</pubDate><description><![CDATA[1. 类图



Subject：目标对象
	一个目标可以被多个观察者观察
		目标提供观察者订阅和取消的维护
		目标对象发生变化，通知所有有效观察者
	
	Observer：定义观察者接口，提供目标对象变化时，对应观察者的更新方法
	ConcreteObserver：具体观察者实现
	ConcreteSubject：具体目标对象实现
2. 示例


修改目标的数据，触发相应通知，联动调用观察者的方法


2.1 目标对象

知道所有的观察者，并提供和维护观察者的订阅与退订逻辑


public clas]]></description><category></category></item><item><title><![CDATA[备忘录模式]]></title><link>https://blog.youkuaiyun.com/danadreamer/article/details/116422763</link><guid>https://blog.youkuaiyun.com/danadreamer/article/details/116422763</guid><author>danadreamer</author><pubDate>Thu, 06 May 2021 10:03:20 +0800</pubDate><description><![CDATA[1. 类图



Memento：备忘录。存储原发器对象的内部状态
	Orginator：原发器。使用备忘录来保存某个时刻原发器自身的状态
	Caretaker：备忘录管理者。保存备忘录对象
2. 示例


保存和恢复内部状态


2.1 备忘录


// 备忘录接口
public interface Memento {}

// 实现类 blod保存原发器信息
public class MementoImpl implements Memento {
    private int blod;

    ]]></description><category></category></item></channel></rss>