<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Same_Liu的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Same_Liu</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Same_Liu]]></copyright><item><title><![CDATA[JVM 之 G1收集器]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/89817682</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/89817682</guid><author>Same_Liu</author><pubDate>Tue, 07 May 2019 21:21:17 +0800</pubDate><description><![CDATA[G1收集器概述
从JDK(1.3)开始，HotSpot团队一直努力朝着高效收集、减少停顿(STW: Stop The World)的方向努力，也贡献了从串行Serial收集器、到并行收集器Parallerl收集器，再到CMS并发收集器，乃至如今的G1在内的一系列优秀的垃圾收集器。
G1(Garbage First)垃圾收集器是当今垃圾回收技术最前沿的成果之一。早在JDK7就已加入JVM的收集器大家...]]></description><category></category></item><item><title><![CDATA[Java 集合面试]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/89881458</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/89881458</guid><author>Same_Liu</author><pubDate>Tue, 07 May 2019 21:21:06 +0800</pubDate><description><![CDATA[1.说一说 HashMap 的实现原理？


HashMap 的底层是个 Node  数组（Node&lt;K, V&gt;[] table），在数组的具体索引位置，如果存在多个节点，则可能是以链表或红黑树的形式存在。


增加、删除、查找键值对时，定位到哈希桶数组的位置是很关键的一步，源码中是通过下面 3 个操作来完成这一步：
1）拿到 key 的 hashCode值；
2）将 hashCode...]]></description><category></category></item><item><title><![CDATA[Spring 面试题]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/89919021</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/89919021</guid><author>Same_Liu</author><pubDate>Tue, 07 May 2019 21:20:49 +0800</pubDate><description><![CDATA[1.Spring拦截器实现了哪些方法？底层原理？
// HandlerInterceptor.java

/**
 * 拦截处理器，在 {@link HandlerAdapter#handle(HttpServletRequest, HttpServletResponse, Object)} 执行之前
 */
default boolean preHandle(HttpServletRequest...]]></description><category></category></item><item><title><![CDATA[Dubbo 面试题]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/89816300</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/89816300</guid><author>Same_Liu</author><pubDate>Sat, 04 May 2019 18:28:34 +0800</pubDate><description><![CDATA[1.Dubbo是什么？
Dubbo 是一个分布式、高性能、透明化的 RPC 服务框架，提供服务自动注册、自动发现等高效服务治理方案， 可以和 Spring 框架无缝集成。
RPC 指的是远程调用协议，也就是说两个服务器交互数据。
2.Dubbo的由来？
互联网的快速发展，Web应用程序的规模不断扩大，一般会经历如下四个发展阶段。


单一应用架构

当网站流量很小时，只需一个应用，将所有功能都部署...]]></description><category></category></item><item><title><![CDATA[第3章 RocketMQ集群]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/89518097</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/89518097</guid><author>Same_Liu</author><pubDate>Thu, 25 Apr 2019 16:04:02 +0800</pubDate><description><![CDATA[第3章 RocketMQ集群
3.1 RocketMQ集群模式
3.1.1 单个Master
这是一种风险比较大的集群方式，因为一旦Borker重启或宕机期间，将会导致这个服务不可用，因此是不建议线上环境去使用的。
3.1.2 多个Master
​ 一个集群全部都是Master，没有Slave,它的优点和缺点如下：
优点：配置简单，单个Master宕机或者是重启维护对应用没有什么影响的，在磁盘配置...]]></description><category></category></item><item><title><![CDATA[第2章 RocketMQ快速入门]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/89517571</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/89517571</guid><author>Same_Liu</author><pubDate>Thu, 25 Apr 2019 15:46:18 +0800</pubDate><description><![CDATA[第2章 RocketMQ快速入门
2.1 消息生产和消费介绍
使用RocketMQ可以发送普通消息、顺序消息、事务消息，顺序消息能实现有序消费，事务消息可以解决分布式事务实现数据最终一致。
RocketMQ有2种常见的消费模式,分别是DefaultMQPushConsumer和DefaultMQPullConsumer模式，这2种模式字面理解一个是推送消息，一个是拉取消息。这里有个误区，其实无论是...]]></description><category></category></item><item><title><![CDATA[第1章 RocketMQ 介绍与安装]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/89517131</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/89517131</guid><author>Same_Liu</author><pubDate>Thu, 25 Apr 2019 15:30:31 +0800</pubDate><description><![CDATA[第1章 RocketMQ
1.1 MQ介绍
​ MQ全称为Message Queue, 消息队列（MQ）是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息（针对应用程序的数据）来通信，而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信，而不是通过直接调用彼此来通信，直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过 队列来通信。队列的使用除去...]]></description><category></category></item><item><title><![CDATA[为什么新生代内存需要有两个Survivor区]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88936499</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88936499</guid><author>Same_Liu</author><pubDate>Mon, 01 Apr 2019 10:23:19 +0800</pubDate><description><![CDATA[在JVM的新生代内存中，为什么除了Eden区，还要设置两个Survivor区？
1、为什么要有Survivor区：
先不去想为什么有两个Survivor区，第一个问题是，设置Survivor区的意义在哪里？

如果没有Survivor，Eden区每进行一次Minor GC，存活的对象就会被送到老年代。老年代很快被填满，触发Major GC（因为Major GC一般伴随着Minor GC，也可以看做...]]></description><category></category></item><item><title><![CDATA[常见JVM参数配置和GC性能优化]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88936443</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88936443</guid><author>Same_Liu</author><pubDate>Sun, 31 Mar 2019 21:50:32 +0800</pubDate><description><![CDATA[一、常见的JVM参数配置：
1、垃圾回收统计信息：
-XX:+PrintGC     打印GC简要信息
-XX:+PrintGCDetails打印GC的详细信息
-XX:+PrintGCTimeStamps打印CG发生的时间戳
-Xloggc:log/gc.log 指定GC log的位置，以文件输出
-XX:+PrintHeapAtGC 每一次GC前和GC后，都打印堆信息。
2、堆设置：
-Xms...]]></description><category></category></item><item><title><![CDATA[性能监控与故障处理工具]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88936286</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88936286</guid><author>Same_Liu</author><pubDate>Sun, 31 Mar 2019 21:42:19 +0800</pubDate><description><![CDATA[概述：
给一个系统定位问题的时候，知识、经验是关键基础，数据是依据。工具是运用知识处理数据的手段。这里说的数据包括：运行日志、异常堆栈、GC日志、线程快照文件（threaddump/javacore文件）、堆转储快照（heapdump/hprof文件）等。
JDK的命令行工具：JDK的命令行工具大多数是对jdk/lib/tools.jar类库的一层薄包装而已，它们的主要功能代码是在tools类库中...]]></description><category></category></item><item><title><![CDATA[七种垃圾收集器特点、优劣势、及使用场景]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88936196</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88936196</guid><author>Same_Liu</author><pubDate>Sun, 31 Mar 2019 21:37:14 +0800</pubDate><description><![CDATA[HotSpot  JVM：

上面有7种收集器，分为两块，上面为新生代收集器，下面是老年代收集器。如果两个收集器之间存在连线，就说明它们可以搭配使用。
一、Serial（串行GC）收集器：
Serial收集器是一个新生代收集器，单线程执行，使用复制算法。它在进行垃圾收集时，必须暂停其他所有的工作线程(用户线程)。对于限定单个CPU的环境来说，由于没有线程交互的开销，可以获得最高的单线程收集效率。是...]]></description><category></category></item><item><title><![CDATA[垃圾收集与内存分配策略]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88936073</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88936073</guid><author>Same_Liu</author><pubDate>Sun, 31 Mar 2019 21:31:20 +0800</pubDate><description><![CDATA[一、确认对象是否存活：
垃圾收集器在对堆进行回收前，首先要做的事情就是确定对象是否还存活，判断对象是否存活主要有两种算法：引用计数算法和可达性分析算法。
1、引用计数算法：对象创建时，给对象添加一个引用计数器，每当有一个地方引用到它时，计数器值加1,；引用失效时，计数器值减1；当计数值值为0时，这个对象就是不可能再被引用的。
2、可达性分析算法：以“GC Roots”对象为起点，从这些节点向下搜索...]]></description><category></category></item><item><title><![CDATA[运行时内存数据区域、对象内存分配与访问]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88936029</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88936029</guid><author>Same_Liu</author><pubDate>Sun, 31 Mar 2019 21:29:39 +0800</pubDate><description><![CDATA[一、Java运行时内存中的数据区域：
    每一个Java程序启动后，会获得一个JVM的实例，用来管理内存。Java 虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有个字的用途，以及创建和销毁时间。Java虚拟机所管理的内存将会包括以下几个运行时数据区域：


1、程序计数器：程序计数器是一块较小的空间，是当前线程执行的字节码的行号指示器，字节码解释器工...]]></description><category></category></item><item><title><![CDATA[类加载器与双亲委派模型]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88935970</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88935970</guid><author>Same_Liu</author><pubDate>Sun, 31 Mar 2019 21:26:34 +0800</pubDate><description><![CDATA[一、类加载器：
类加载器的任务是根据一个类的全限定名来读取此类的二进制字节流到JVM中，然后转换为一个与目标类对应的java.lang.Class对象实例，在虚拟机默认提供了3种类加载器，引导类加载器（Bootstrap）、扩展类加载器（Extension）、应用类加载器（AppClassLoader），如果有必要还可以加入自己定义的类加载器。
对于任意一个类，都需要由加载它的类加载器和类的全限定...]]></description><category></category></item><item><title><![CDATA[类加载机制、类的加载过程]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88935884</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88935884</guid><author>Same_Liu</author><pubDate>Sun, 31 Mar 2019 21:23:11 +0800</pubDate><description><![CDATA[一、什么是虚拟机的类加载机制：
代码在编译后，就会生成java虚拟机能够识别的二进制字节流class文件，class文件中描述的各种信息，都需要加载到虚拟机之中才能运行和使用。
虚拟机把类的数据从class文件加载到内存，并对数据进行校检，转换解析和初始化，最终形成可以被虚拟机直接使用的Java类型，就是类的加载机制。
类从加载到虚拟机内存开始，到卸载出内存结束，整个生命周期包括七个阶段：加载-&...]]></description><category></category></item><item><title><![CDATA[class类文件结构]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88935797</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88935797</guid><author>Same_Liu</author><pubDate>Sun, 31 Mar 2019 21:18:50 +0800</pubDate><description><![CDATA[一、平台无关性：
Java的无关性的实现，是由于Java源代码编译后生成的存储字节码的文件，即Class文件，以及Java虚拟机的实现。无关性包括：平台无关性以及语言无关性。
（1）平台无关性，是指java代码可以运行在不同操作系统的虚拟机上面，因为不同的操作系统都有各自的Java虚拟机，从而实现程序的“一次编写，到处运行”。
（2）语言无关性是指Java虚拟机能运行除Java以外的代码，JVM执...]]></description><category></category></item><item><title><![CDATA[ConcurrentHashMap详解]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88935634</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88935634</guid><author>Same_Liu</author><pubDate>Sun, 31 Mar 2019 21:11:47 +0800</pubDate><description><![CDATA[(本文使用的源码都是基于JDK1.8的)
ConcurrentHashMap是conccurrent家族中的一个类，由于它可以高效地支持并发操作，以及被广泛使用，经典的开源框架Spring的底层数据结构就是使用ConcurrentHashMap实现的。
与同是线程安全的老大哥HashTable相比，它已经更胜一筹，因此它的锁更加细化，而不是像HashTable一样为几乎每个方法都添加了synchr...]]></description><category></category></item><item><title><![CDATA[HashMap 详解]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88911013</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88911013</guid><author>Same_Liu</author><pubDate>Sun, 31 Mar 2019 20:52:52 +0800</pubDate><description><![CDATA[概述
JDK 1.8对HashMap进行了比较大的优化，底层实现由之前的“数组+链表”改为“数组+链表+红黑树”，本文就HashMap的几个常用的重要方法和JDK 1.8之前的死循环问题展开学习讨论。
JDK 1.8的HashMap的数据结构如下图所示，当链表节点较少时仍然是以链表存在，当链表节点较多时（大于8）会转为红黑树。

几个点：
先了解以下几个点，有利于更好的理解HashMap的源码和阅...]]></description><category></category></item><item><title><![CDATA[LinkedList 详解]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88904253</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88904253</guid><author>Same_Liu</author><pubDate>Fri, 29 Mar 2019 23:44:56 +0800</pubDate><description><![CDATA[（注：本文内容基于JDK1.6）
一、LinkedList概述：
LinkedList与ArrayList一样实现List接口，只是ArrayList是List接口的大小可变数组的实现，LinkedList是List接口链表的实现。
基于链表实现的方式使得LinkedList在插入和删除时更优于ArrayList，而随机访问则比ArrayList逊色些。
LinkedList实现所有可选的列表操作...]]></description><category></category></item><item><title><![CDATA[Vector 详解]]></title><link>https://blog.youkuaiyun.com/Same_Liu/article/details/88901914</link><guid>https://blog.youkuaiyun.com/Same_Liu/article/details/88901914</guid><author>Same_Liu</author><pubDate>Fri, 29 Mar 2019 21:08:10 +0800</pubDate><description><![CDATA[一、Vector简介：
（1）Vector可以实现可增长的对象数组。与数组一样，可以使用整数索引进行访问的组件。不过，Vector的大小是可以增加或者减小的，以便适应创建Vector后进行添加或者删除操作。
（2）同时Vector是线程安全的！底层使用的是synchronized进行加锁。
public class Vector&lt;E&gt;
    extends AbstractList&...]]></description><category></category></item></channel></rss>