<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[RojerAlone的博客]]></title><description><![CDATA[笨鸟先飞，脚踏实地。]]></description><link>https://blog.youkuaiyun.com/Alone_Rojer</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Alone_Rojer]]></copyright><item><title><![CDATA[一次 CPU 飙高异常的处理]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/81952067</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/81952067</guid><author>Alone_Rojer</author><pubDate>Wed, 22 Aug 2018 22:14:57 +0800</pubDate><description><![CDATA[一次 CPU 飙高异常的处理

某天，同事告诉我说我在公司负责的一个服务 CPU 占用过高，达到 700% 多（多核 CPU），猜测可能是 gc 比较频繁，让我调一下堆大小，调整过后重新部署，发现 CPU 使用率降至正常水平（6% 左右）。

过了几天想起来这个事，登上服务器看下服务是否正常，发现 CPU 使用率又到了 500% 多，于是就通过一些工具命令排查问题。



初步排查是否是 gc 问...]]></description><category></category></item><item><title><![CDATA[TCP 三次握手和四次挥手]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77837629</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77837629</guid><author>Alone_Rojer</author><pubDate>Mon, 04 Sep 2017 15:03:16 +0800</pubDate><description><![CDATA[TCP 三次握手和四次挥手三次握手 
如图所示，客户端主动打开连接，服务端被动打开连接。连接过程如下：
客户端发送连接请求报文段，同步位 SYN = 1，同时选择一个初始序号 seq = x（TCP 协议规定，SYN 报文段，也就是 SYN = 1 的报文段不能携带数据，但是会消耗一个序号），这时客户端进入 SYN-SENT （同步已发送）状态。
服务端接收到连接请求报文段以后，如果同意连接，则向客]]></description><category></category></item><item><title><![CDATA[Semaphore]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77800219</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77800219</guid><author>Alone_Rojer</author><pubDate>Sat, 02 Sep 2017 11:49:03 +0800</pubDate><description><![CDATA[SemaphoreSemaphore 是 Java 并发包中提供的一个工具类，翻译过来为“信号量”，作用是控制并发线程的数量。类的结构先来看一下 Semaphore 的结构： 
Semaphore 中有三个个内部类：
类 Sync 继承了 AbstractQueuedSynchronizer，重写了 tryReleaseShared 方法，还有一些在 Semaphore 中用到的辅助方法，都是对线程]]></description><category></category></item><item><title><![CDATA[CyclicBarrier]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77799467</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77799467</guid><author>Alone_Rojer</author><pubDate>Sat, 02 Sep 2017 10:35:54 +0800</pubDate><description><![CDATA[CyclicBarrier字面意思“循环屏障”，翻译为“可重用的屏障”更贴切一点。这个工具类的作用是起到一个栅栏的作用，当指定数量的线程都执行到某一个步骤之后，再一起往下执行，相当于一个阀门，容量满了再开阀门。看一下这个类的结构：这个类没有继承 AbstractQueuedSynchronizer，内部类也没有继承，而是使用了 ReentrantLock lock 这样一个变量来控制线程同步，内部类]]></description><category></category></item><item><title><![CDATA[CountDownLatch]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77799329</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77799329</guid><author>Alone_Rojer</author><pubDate>Sat, 02 Sep 2017 10:34:29 +0800</pubDate><description><![CDATA[CountDownLatchCountDownLatch 直译过来为“倒数阀门”，顾名思义，它是起到一个阀门的作用，实际上是用来控制线程的执行过程。来看一下这个类提供了哪些方法： 
从图中可以看出，CountDownLatch 的构造方法是传入一个整数，然后提供了 await()、countDown()、getCount() 等方法，还有一个内部类 Sync，这个内部类继承了 AbstractQue]]></description><category></category></item><item><title><![CDATA[AbstractQueuedSynchronizer 之 共享锁]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77506797</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77506797</guid><author>Alone_Rojer</author><pubDate>Wed, 23 Aug 2017 15:38:59 +0800</pubDate><description><![CDATA[AbstractQueuedSynchronizer 之 共享锁acquireShared/**
 * Acquires in shared mode, ignoring interrupts.  Implemented by
 * first invoking at least once {@link #tryAcquireShared},
 * returning on success.  Ot]]></description><category></category></item><item><title><![CDATA[AbstractQueuedSynchronizer 之 互斥锁]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77506754</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/77506754</guid><author>Alone_Rojer</author><pubDate>Wed, 23 Aug 2017 15:36:28 +0800</pubDate><description><![CDATA[AbstractQueuedSynchronizer 之 互斥锁acquire源码如下：/**
 * Acquires in exclusive mode, ignoring interrupts.  Implemented
 * by invoking at least once {@link #tryAcquire},
 * returning on success.  Otherwise th]]></description><category></category></item><item><title><![CDATA[ThreadPool 之 线程池工具类 Executors]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/76650776</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/76650776</guid><author>Alone_Rojer</author><pubDate>Thu, 03 Aug 2017 20:51:50 +0800</pubDate><description><![CDATA[接上篇 ThreadPool 之 Callable、Future 和 FutureTask。用 Executors 创建线程池　　JDK 中提供了一个 Executors 类，在这个类中构造好了几个通用的线程池，并且 JDK 文档中也强烈推荐（urged to use）使用 Executors 来构建线程池。Executors/**
 * 创建容量为 nThreads 的线程池，最大工作线程也为 n]]></description><category></category></item><item><title><![CDATA[ThreadPool 之 Callable、Future 和 FutureTask]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/76650430</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/76650430</guid><author>Alone_Rojer</author><pubDate>Thu, 03 Aug 2017 20:47:20 +0800</pubDate><description><![CDATA[ThreadPool 之 Callable、Future 和 FutureTaskCallable、Future 和 FutureTask　　一般情况下，线程有两种创建方式，一种是继承 Thread 类，一种是实现 Runnable 接口。在线程运行执行的都是 run 方法，这是一个 void 方法，没有返回值。如果要获取线程执行的结果，就必须传入一个变量，在执行完之前将结果写入这个变量中。　　从]]></description><category></category></item><item><title><![CDATA[ThreadPool 之 线程池实现类 ThreadPoolExecutor]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/76512407</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/76512407</guid><author>Alone_Rojer</author><pubDate>Tue, 01 Aug 2017 11:08:13 +0800</pubDate><description><![CDATA[ThreadPool 之线程池实现类 ThreadPoolExecutor　　接上篇文章 ThreadPool 之 线程池概览。ThreadPoolExecutor 线程池　　ThreadPoolExecutor 继承了 AbstractExecutorService，实现了核心方法 execute 以及一些获取线程池信息的方法。　　ThreadPoolExecutor 有一些重要的参数：// ct]]></description><category></category></item><item><title><![CDATA[ThreadPool 之 线程池概览]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/76359809</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/76359809</guid><author>Alone_Rojer</author><pubDate>Sun, 30 Jul 2017 00:10:15 +0800</pubDate><description><![CDATA[ThreadPool[注] 本文中的源码基于 JDK1.8，源码中的注释为 JDK 中注释的翻译加上个人的理解。如有错误欢迎指正。引言　　因为进程的切换相当耗费资源，加上 CPU 的发展，操作系统中引入了线程的概念。相比于进程的上下文切换，线程的切换更轻量级，但是不代表没有开销，而且大部分多线程的生命周期都比较短，会发生频繁的线程创建、销毁动作，这也是相当消耗资源的，因此引入了线程池。　　合理利用线]]></description><category></category></item><item><title><![CDATA[Java 由生至死]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/74932242</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/74932242</guid><author>Alone_Rojer</author><pubDate>Tue, 11 Jul 2017 17:25:35 +0800</pubDate><description><![CDATA[对象是怎么降生的从.java文件到.class文件　　计算机硬件只能识别机器码0和1，Java编译器（javac）将.java文件编译成.class的字节码文件，再由JVM加载.class文件，执行时解释为机器码进行执行，可以说Java是一种半编译半解释型的语言。JVM加载. class文件.class文件的结构
  Class文件是一组以8位字节为基础单位的二进制流，各个数据项目严格按照顺序紧凑地]]></description><category></category></item><item><title><![CDATA[LeetCode - Keyboard Row]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73824569</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73824569</guid><author>Alone_Rojer</author><pubDate>Tue, 27 Jun 2017 22:46:21 +0800</pubDate><description><![CDATA[题目　　给一个字符串数组，返回这些字符串中 所有字符在美式键盘中在同一行的字符串， 比如 qwe 和 asd 都在同一行，qaz 就不在同一行。思路　　将每一行的字符放在 map 中，每一行的每个字符对应该行的 index，获取字符串的第一个字符，遍历字符串中的每个字符，如果和第一个字符所在行不一致就进入下一轮遍历。代码public class KeyboardRow {    private st]]></description><category></category></item><item><title><![CDATA[LeetCode - CountingBits]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73802006</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73802006</guid><author>Alone_Rojer</author><pubDate>Tue, 27 Jun 2017 16:54:19 +0800</pubDate><description><![CDATA[题目
  Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1’s in their binary representation and return them as an array. 
  Example: 
  For num]]></description><category></category></item><item><title><![CDATA[LeetCode - Number Complement]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73800575</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73800575</guid><author>Alone_Rojer</author><pubDate>Tue, 27 Jun 2017 15:54:41 +0800</pubDate><description><![CDATA[题目　　求一个数的二进制每一位取反后的数。思路　　运用异或的特性,101 ^ 111 = 010，任意数字和n个1的二进制异或，相当于每一位取反。代码public int findComplement(int num) {
    int res = num;
    int tmp = 1;
    // 每循环一次，tmp乘2
    while (num > 0) {
        tmp]]></description><category></category></item><item><title><![CDATA[LeetCode - Merge Two Binary Trees]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73799973</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73799973</guid><author>Alone_Rojer</author><pubDate>Tue, 27 Jun 2017 15:27:46 +0800</pubDate><description><![CDATA[题目
  Given two binary trees and imagine that when you put one of them to cover the other, some nodes of the two trees are overlapped while the others are not.
  
  You need to merge them into a new bin]]></description><category></category></item><item><title><![CDATA[LeetCode - Complex Number Multiplication]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73799845</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73799845</guid><author>Alone_Rojer</author><pubDate>Tue, 27 Jun 2017 15:08:59 +0800</pubDate><description><![CDATA[题目　　输入两个 a+bi格式的字符串，计算它们的乘积，i^2=-1，输出结果也为a+bi的形式。 
　　如 输入”1+1i”, “1+1i” (1 + i) * (1 + i) = 1 + i^2 + 2 * i = 2i，输出0+2i思路　　从字符串中抽取出数字进行计算，计算过后再进行拼装结果字符串。代码    public String complexNumberMultiply(String]]></description><category></category></item><item><title><![CDATA[LeetCode - Array Partition I]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73798252</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73798252</guid><author>Alone_Rojer</author><pubDate>Tue, 27 Jun 2017 14:51:47 +0800</pubDate><description><![CDATA[题目
  Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1, b1), (a2, b2), …, (an, bn) which makes sum of min(ai, bi) for all i from 1 to n as large as po]]></description><category></category></item><item><title><![CDATA[LeetCode - Encode And Decode TinyURL]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73776690</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73776690</guid><author>Alone_Rojer</author><pubDate>Tue, 27 Jun 2017 11:50:06 +0800</pubDate><description><![CDATA[题目
  TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/design-tinyurl and it returns a short URL such as http://tinyurl.com/4e9iAk.
  
  Design the encode]]></description><category></category></item><item><title><![CDATA[LeetCode - Hamming Distance]]></title><link>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73776569</link><guid>https://blog.youkuaiyun.com/Alone_Rojer/article/details/73776569</guid><author>Alone_Rojer</author><pubDate>Tue, 27 Jun 2017 11:46:03 +0800</pubDate><description><![CDATA[题目汉明距离-百度百科
  Input: x = 1, y = 4 
  Output: 2 
  Explanation: 
  1   (0 0 0 1) 
  4   (0 1 0 0) 
   　　 ↑　↑ 
   The above arrows point to positions where the corresponding bits are different.
思路　　将两个数异]]></description><category></category></item></channel></rss>