<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[qq_33654052的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/qq_33654052</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_33654052]]></copyright><item><title><![CDATA[JAVA虚拟机学习总结——虚拟机字节码执行引擎]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80554077</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80554077</guid><author>qq_33654052</author><pubDate>Sun, 03 Jun 2018 08:53:42 +0800</pubDate><description><![CDATA[运行时的栈帧结构

栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构，它是虚拟机运行时数据区中的虚拟机栈的栈元素。 
栈帧存储了方法的局部变量表，操作数栈，动态连接和方法返回值等信息每一个方法从调用至执行完成的过程，都对应者栈帧在虚拟机栈里面从入找到出栈的过程。 
在编译程序代码的时候，栈帧需要多大的局部变量表，多深的操作数栈都已经完全确定，并且写入到了Code属性之中，因此一个栈帧需要分配多...]]></description><category></category></item><item><title><![CDATA[JAVA虚拟机学习总结——垃圾收集与内存回收]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80458761</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80458761</guid><author>qq_33654052</author><pubDate>Sat, 26 May 2018 08:10:36 +0800</pubDate><description><![CDATA[垃圾收集器与内存回收策略



判断对象是否已死


引用计数器
可达性分析算法




四种引用类型


强引用：只要这类引用还存在，就不会回收。
软引用:在系统将要发生内存溢出异常之前，将会把这些对象列进回收范围之中进行二次回收。
弱引用:只能生存到下一次垃圾收集发生之前。当垃圾收集工作时，无论当前内存是否足够，都会回收掉只被弱引用关联的对象。
虚引用:一个对象是否有虚引用存在，完全不会对其生...]]></description><category></category></item><item><title><![CDATA[JAVA虚拟机学习总结——运行期优化]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80456474</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80456474</guid><author>qq_33654052</author><pubDate>Fri, 25 May 2018 20:28:51 +0800</pubDate><description><![CDATA[JAVA虚拟机的运行期优化



解释器与编译器

java 程序最初就是通过解释器进行解释执行的。当虚拟机发现某个方法或代码块的运行特别频繁时，就会把这些代码认定为“热点代码”。为了提高热点代码的运行效率，在运行时，虚拟机会把这些代码编译成于本地平台相关的机器码，并进行各个层次的优化，完成这个任务的编译器称为即时编译器。



解释器与编译器共存


在程序启动的时候，解释器可以首先发挥作用，省...]]></description><category></category></item><item><title><![CDATA[JAVA虚拟机学习总结——Java内存模型与线程]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80428837</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80428837</guid><author>qq_33654052</author><pubDate>Thu, 24 May 2018 07:09:48 +0800</pubDate><description><![CDATA[JAVA与线程

线程是CPU调度的基本单位



JAVA线程的调度



协同式调度

线程的执行时间由线程本身控制，线程把自己的工作执行完成以后，会主动通知系统切换到另一个线程上



抢占式调度

每个线程将由系统来分配时间，线程的切换不由线程本身来决定



线程的六种状态



新建

创建后尚未启动的线程



运行

这时的线程可能在运行，也有可能在等待着CPU为它分配时间



...]]></description><category></category></item><item><title><![CDATA[JAVA虚拟机学习总结——类加载机制]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80370323</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80370323</guid><author>qq_33654052</author><pubDate>Fri, 18 May 2018 22:41:28 +0800</pubDate><description><![CDATA[虚拟机学习总结



类加载机制

虚拟机把描述类的信息从Class文件中加载到内存，并对数据进行校验，解析和初始化，最终形成可以被虚拟机直接使用的过程。 
类型的加载，连接和初始化都是在运行期间完成的一运行期动态加载和动态连接。 
类的生命周期:加载连接初始化使用-卸载，其中连接又包括:校验，准备和解析。其中，除了解析以外，其他阶段都是按部就班地“开始”(通常会在一个阶段执行的过程中调用，激活另...]]></description><category></category></item><item><title><![CDATA[JAVA虚拟机学习总结-内存区域]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80369698</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80369698</guid><author>qq_33654052</author><pubDate>Fri, 18 May 2018 21:31:52 +0800</pubDate><description><![CDATA[虚拟机学习总结-内存区域



虚拟机的内存区域划分

JAVA虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域



1.程序计数器

当前线程所执行的字节码的行号指示器，字节码解释器就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。每条线程都需要有一个独立的程序计算器(线程私有)。如果线程正在执行的是一个java方法，计数器记录的就是正在执行的虚拟机字节码...]]></description><category></category></item><item><title><![CDATA[Spring Cloud 学习总结]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80304856</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80304856</guid><author>qq_33654052</author><pubDate>Mon, 14 May 2018 07:17:44 +0800</pubDate><description><![CDATA[Spring Cloud 学习笔记



微服务架构

微服务架构风格是一种使用一套小服务来开发单个应用的方式途径，每个服务运行在自己的进程中，服务之间相互协调，互相配合，为用户提供最终价值。服务之间使用轻量级机制通信，通常是HTTP的RESTful API，这些服务基于业务能力构建，并能够通过自动化部署机制来独立部署，这些服务使用不同的编程语言实现，以及不同数据存储技术，并保持最低限度的集中式管...]]></description><category></category></item><item><title><![CDATA[且说 深度优先搜索算法]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80288734</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80288734</guid><author>qq_33654052</author><pubDate>Sat, 12 May 2018 10:18:25 +0800</pubDate><description><![CDATA[       在我做LintCode上面算法题目的时候，发现深度优先搜索算法是一个实用性非常强的算法，它帮助我解决了很多题目。下面我就来谈一下我对这个算法的理解和应用。        我觉得百度百科上面对于这个算法的解释还比较详细：   定义：    深度优先搜索算法（Depth-First-Search），是搜索算法的一种。是沿着树的深度遍历树的节点，尽可能深的搜索树的分支。当节点v的所有边都己...]]></description><category></category></item><item><title><![CDATA[且说 死锁 synchronize]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80288323</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80288323</guid><author>qq_33654052</author><pubDate>Sat, 12 May 2018 09:15:52 +0800</pubDate><description><![CDATA[死锁是面试中常考的一个点，也是我们工作中应该尽量避免的BUG。在多线程任务中，死锁是很容易产生的。    死锁是指两个或两个以上的进程在执行过程中，由于竞争资源或者由于彼此通信而造成的一种阻塞的现象，若无外力作用，
它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁，这些永远在互相等待的进程称为死锁进程。    简单来说，比如，有两个同事一起工作，他们完成各自的工作都需要用到两个工具，但...]]></description><category></category></item><item><title><![CDATA[背包问题 LintCode]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80287288</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80287288</guid><author>qq_33654052</author><pubDate>Fri, 11 May 2018 22:28:42 +0800</pubDate><description><![CDATA[首次在LintCode上做了一个]]></description><category></category></item><item><title><![CDATA[滑动窗口的最大值 LintCode]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80286833</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80286833</guid><author>qq_33654052</author><pubDate>Fri, 11 May 2018 21:35:28 +0800</pubDate><description><![CDATA[这个是我完成的第一个 LintCode 上面的超难的题目，特此纪念一下，并分享一下结题的思路。原题目链接：滑动窗口的最大值 问题描述：给出一个可能包含重复的整数数组，和一个大小为 k 的滑动窗口, 从左到右在数组中滑动这个窗口，找到数组中每个窗口内的最大值。样例说明：        给出数组 [1,2,7,7,8], 滑动窗口大小为 k = 3. 返回 [7,7,8].
	解释：
	最开始，窗口的...]]></description><category></category></item><item><title><![CDATA[编发编程的使用工具--栅栏 CyclicBarrier]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80208883</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80208883</guid><author>qq_33654052</author><pubDate>Sat, 05 May 2018 20:33:16 +0800</pubDate><description><![CDATA[    我们在看田径比赛时，会有这样的场景：一群运动员先后到达起点准备，然后在一声枪响之后，所有运动员同时起跑，奔向终点。    在JAVA并发编程体系中，也有仿真的工具——CyclicBarrier。我们先来看看《JAVA编程思想第四版》中对于CyclicBarrier的解释：CyclicBarrier适用于这样的情况：你希望新建一组任务，他们并行的执行任务，然后在进行下一步之前等待，
直到所有...]]></description><category></category></item><item><title><![CDATA[用CountDownLatch实现在走完10个线程之后再进行操作]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80202466</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80202466</guid><author>qq_33654052</author><pubDate>Sat, 05 May 2018 10:14:41 +0800</pubDate><description><![CDATA[    在上一篇博客中，我们用Callable实现了这个功能：用Callable实现在走完10个线程之后再进行操作，其中也提到了使用CountDownLatch实现是一个更好地选择，下面，我们就来看看如何使用用CountDownLatch实现在走完10个线程之后再进行操作。                                                               ...]]></description><category></category></item><item><title><![CDATA[用Callable实现在走完10个线程之后再进行操作]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80199482</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80199482</guid><author>qq_33654052</author><pubDate>Fri, 04 May 2018 22:34:51 +0800</pubDate><description><![CDATA[昨天一个碰到了一个题目：如何编程，使得主线程在跑完十个线程之后，再进行后续操作。看到这个问题，我的第一反应就是可以使用Callable来实现。因为实现线程有两种方式，实现Callable接口或者实现Runnable接口（至于继承Thread类，我觉得这个方式其实本质上还是实现了Runnable接口）。但是用Runnable实现线程，我们一般是不知道线程有没有跑完的，除非经过特殊处理（如使用Coun...]]></description><category></category></item><item><title><![CDATA[带环链表 判断链表是否有环 LintCode算法题目]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80186116</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80186116</guid><author>qq_33654052</author><pubDate>Thu, 03 May 2018 20:38:37 +0800</pubDate><description><![CDATA[这是 LintCode 上面的一个算法题目--带环链表，目的是判断链表是否有环。问题描述：给定一个链表，判断它是否有环。样例说明：给出 -21-&amp;gt;10-&amp;gt;4-&amp;gt;5, tail connects to node index 1，返回 true代码public class TestHasCycle {
    public boolean hasCycle(ListNode head...]]></description><category></category></item><item><title><![CDATA[青蛙跳 LintCode青蛙过河问题]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80147140</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80147140</guid><author>qq_33654052</author><pubDate>Mon, 30 Apr 2018 09:11:31 +0800</pubDate><description><![CDATA[这个是 LintCode 上面的一道算法问题--青蛙跳	问题描述：        一只青蛙正要过河，这条河分成了 x 个单位，每个单位可能存在石头，青蛙可以跳到石头上，但它不能跳进水里。
	按照顺序给出石头所在的位置，判断青蛙能否到达最后一块石头所在的位置。刚开始时青蛙在第一块石头上，假设青蛙第一次跳只能跳一个单位的长度。
	如果青蛙最后一个跳 k 个单位，那么它下一次只能跳 k - 1 ，k 或...]]></description><category></category></item><item><title><![CDATA[带环链表问题 查找带环链表的起始环节点]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80140786</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80140786</guid><author>qq_33654052</author><pubDate>Sun, 29 Apr 2018 08:02:22 +0800</pubDate><description><![CDATA[这个问题是 LintCode 上面的一个算法题目( 带环链表 II )，主要考察的是对于链表，带环链表的理解。原问题描述：给定一个链表，如果链表中存在环，则返回到链表中环的起始节点，如果没有环，返回null。样例：给出 -21-&amp;gt;10-&amp;gt;4-&amp;gt;5, tail connects to node index 1，返回10分析：这个问题的思路主要分为以下几步：	1.判断这个链表是不是带...]]></description><category></category></item><item><title><![CDATA[练习的算法题目]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/80027119</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/80027119</guid><author>qq_33654052</author><pubDate>Sat, 21 Apr 2018 10:49:43 +0800</pubDate><description><![CDATA[本人平时闲着会刷一刷lintCode的算法题目lintCode官网：lintCode我会将自己做的题目的代码以及思路解析放在gitHub上面，坚持每天至少一题。本人的gitHub算法提交：        codeeeeeer的gitHub有兴趣的话，大家可以交流下解题思路，共同进步。...]]></description><category></category></item><item><title><![CDATA[算法 啤酒 酒瓶 瓶盖 兑换问题]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/79933888</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/79933888</guid><author>qq_33654052</author><pubDate>Fri, 13 Apr 2018 20:55:19 +0800</pubDate><description><![CDATA[今天有人在java交流群里面有人问到一个算法问题：一个算法题：啤酒2块钱1瓶，4个瓶盖换1瓶2个空瓶换1瓶问：10块钱可以喝几瓶？首先，可以用10元买下5瓶啤酒，然后得到5个酒瓶和5个瓶盖，然后又可以用酒瓶和瓶盖兑换啤酒，得到的啤酒又可以有酒瓶和瓶盖，然后又能兑换啤酒。。。。如此反复。。但是多个瓶盖和酒瓶才能兑换一瓶啤酒，所以总有不能再兑换的时候。以下是我的代码：/**
 * 2018-04-13...]]></description><category></category></item><item><title><![CDATA[使用枚举缓存SimpleDateFormat实例]]></title><link>https://blog.youkuaiyun.com/qq_33654052/article/details/79796628</link><guid>https://blog.youkuaiyun.com/qq_33654052/article/details/79796628</guid><author>qq_33654052</author><pubDate>Mon, 02 Apr 2018 23:07:11 +0800</pubDate><description><![CDATA[在我们的项目中，时常需要对日期进行操作，因此常常会大量的产生SimpleDateFormat实例，但是，1.SimpleDateFormat的初始化其实是比较耗费性能的，2.这个日期的格式大部分都是那么几种，诸如yyyy-MM-dd HH:mm:ss，yyyy-MM-dd等等3.SimpleDateFormat是线程不安全的，所以我们又不得不对每个格式都至少有一个 实例综上几点，我们可以使用一个M...]]></description><category></category></item></channel></rss>