<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[蒟蒻达的博客]]></title><description><![CDATA[蒟蒻一枚]]></description><link>https://blog.youkuaiyun.com/qq_40986486</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; qq_40986486]]></copyright><item><title><![CDATA[JAVA 秒转时分秒 hh:mm:ss 格式]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/109364867</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/109364867</guid><author>qq_40986486</author><pubDate>Thu, 29 Oct 2020 17:25:39 +0800</pubDate><description><![CDATA[/**
     * 功能描述 秒转时分秒
     * @author qinda
     * @date 2020/10/29
     * @param sumSecond 总秒数
     * @return java.lang.String 返回 “ 01:01:01 ” 格式的时间
     */
    private static String sumSecondToTime(int sumSecond) {
        if(sumSecond &lt;= 0){
     ...]]></description><category></category></item><item><title><![CDATA[JVM---执行引擎]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/107128863</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/107128863</guid><author>qq_40986486</author><pubDate>Sat, 04 Jul 2020 19:07:17 +0800</pubDate><description><![CDATA[执行引擎

执行引擎是Java虚拟机核心的组成部分之一
“虚拟机”是一个相对于“物理机”的概念，这两种机器都有代码执行能力，其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的，而虛拟机的执行引擎则是由软件自行实现的，因.此可以不受物理条件制约地定制指令集与执行引擎的结构体系，能够执行那些不被硬件直接支持的指令集格式。

JVM的主要任务是负责装载字节码到其内部，但字节码并不能够直接运行在操作系统之上，因为字节码指令并非等价于本地机器指令，它内部包含的仅仅只是一些能够被JVM所识别的字]]></description><category></category></item><item><title><![CDATA[JVM---方法区]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/107128816</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/107128816</guid><author>qq_40986486</author><pubDate>Sat, 04 Jul 2020 19:04:16 +0800</pubDate><description><![CDATA[方法区
栈、堆、方法区的交互关系


方法区基本理解


方法区(Method Area)与Java堆一 样， 是各个线程共享的内存区域。


方法区在JVM启动的时候被创建，并且它的实际的物理内存空间中和Java堆区–样都可以是不连续的。


方法区的大小，跟堆空间一样，可以选择固定大小或者可扩展。


方法区的大小决定了系统可以保存多少个类，如果系统定义了太多的类，导致方法区溢出，虚拟机同样会抛出内存溢出错误: java. lang . OutOfMemoryError:PermGen space 或者]]></description><category></category></item><item><title><![CDATA[JVM---堆（垃圾回收机制）]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106903263</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106903263</guid><author>qq_40986486</author><pubDate>Mon, 22 Jun 2020 15:45:16 +0800</pubDate><description><![CDATA[图解对象分配过程
为新对象分配内存是一件非常严谨和复杂的任务，JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题，并且由于内存分配算法与内存回收算法密切相关，所以还需要考虑GC执行完内存回收后是否会在内存空间中停生内存碎片。
1.new的对象先放伊甸园区。此区有大小限制。
2.当伊甸园的空间填满时，程序又需要创建对象，JVM的垃圾 回收器将对伊甸园区进行垃圾回收(Minor GC)， 将伊甸园区中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到伊甸园区
3.然后将伊甸园中的剩余对象移动到幸存]]></description><category></category></item><item><title><![CDATA[JVM---堆（概述）]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106903157</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106903157</guid><author>qq_40986486</author><pubDate>Mon, 22 Jun 2020 15:42:51 +0800</pubDate><description><![CDATA[堆
概述


一个JVM实例只存在一个堆内存，堆也是Java内存管理的核心区域。


Java堆区在JVM启动的时候即被创建，其空间大小也就确定了。是JVM管理的最大一块内存空间。

堆内存的大小是可以调节的。



《Java虚拟机规范》规定，堆可以处于物理.上不连续的内存空间中，但在逻辑上它应该被视为连续的。


所有的线程共享Java堆，在这里还可以划分线程私有的缓冲区( ThreadLocal Allocation Buffer， TLAB) 。


《Java虛拟机规范》中对Java堆的描述是:所]]></description><category></category></item><item><title><![CDATA[JVM---本地方法接口与本地方法栈]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106825285</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106825285</guid><author>qq_40986486</author><pubDate>Thu, 18 Jun 2020 10:40:48 +0800</pubDate><description><![CDATA[本地方法接口
什么是本地方法?
简单地讲，一个Native Method就 是一个Java调用非Java代码的接口。 一个Native Method是这样-一个Java方法:该方法的实现由非Java语言实现，比如C。这个特征并非Java所特有，很多其它的编程语言都有这一机制，比如在C++中，你可以用extern "C"告 知C+ +编译器去调用-一个C的函数。"A native method is a Java method whose implementation is provided by non-j]]></description><category></category></item><item><title><![CDATA[JVM---虚拟机栈]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106825235</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106825235</guid><author>qq_40986486</author><pubDate>Thu, 18 Jun 2020 10:39:48 +0800</pubDate><description><![CDATA[虚拟机栈
虚拟机栈出现的背景
由于跨平台性的设计，Java的指令都是根据栈来设计的。不同平台CPU架构不同，所以不能设计为基于寄存器的。优点是跨平台，指令集小，编译器容易实现，缺点是性能下降，实现同样的功能需要更多的指令。
内存中的栈与堆
栈是运行时的单位，而堆是存储的单位。
即:栈解决程序的运行问题，即程序如何执行，或者说如何处理数据。堆解决的是数据存储的问题，即数据怎么放、放在哪儿。
Java虚拟机栈是什么?

Java虚拟机栈(Java Virtual Machine Stack) ，早期也叫Java]]></description><category></category></item><item><title><![CDATA[JVM---程序计数器（PC寄存器）]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106825191</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106825191</guid><author>qq_40986486</author><pubDate>Thu, 18 Jun 2020 10:37:31 +0800</pubDate><description><![CDATA[程序计数器
简介
JVM中的程序计数寄存器(Program Counter Register) 中，Register 的命名源于CPU的寄存器，寄存器存储指令相关的现场信息。CPU只有 把数据装载到寄存器才能够运行。这里，并非是广义上所指的物理寄存器，或许将其翻译为PC计数器(或指令计数器)会更加贴切(也称为程序钩子)，并且也不容易引起一些不必要的误会。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。
作用
PC寄存器用来存储指向下一条指令的地址，也即将要执行的指令代码。由执行引擎读取下一条指令。

]]></description><category></category></item><item><title><![CDATA[JVM---运行时数据区（线程）]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106825080</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106825080</guid><author>qq_40986486</author><pubDate>Thu, 18 Jun 2020 10:35:52 +0800</pubDate><description><![CDATA[2、运行时数据区
前言
内存是非常重要的系统资源，是硬盘和CPU的中间仓库及桥梁，承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java|在运行过程中内存申请、分配、管理的策略，保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。结合JVM虚拟机规范，来探讨一下经典的JVM内存布局。

方法区与堆是线程共享的，程序计数器、本地方法栈、虚拟机栈是线程私有的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUpgO9n6-1592447]]></description><category></category></item><item><title><![CDATA[JVM---内存管理（类加载子系统）]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106824967</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106824967</guid><author>qq_40986486</author><pubDate>Thu, 18 Jun 2020 10:30:12 +0800</pubDate><description><![CDATA[JVM内存管理：

1、类加载器子系统
作用

类加载器子系统负责从文件系统或者网络中加载Class文件，class文件在文件开
头有特定的文件标识。
ClassLoader只 负责class文件的加载， 至于它是否可以运行，则由Execution
Engine决定。
加载的类信息存放于一块称为方法区的内存空间。除了类的信息外，方法区中还会
存放运行时常量池信息，可能还包括字符串字面量和数字常量(这部分常量信息是
Class文件中常量池部分的内存映射)

加载过程


class file 存在于本地硬盘上]]></description><category></category></item><item><title><![CDATA[JVM---生命周期与发展历程]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106824850</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106824850</guid><author>qq_40986486</author><pubDate>Thu, 18 Jun 2020 10:25:37 +0800</pubDate><description><![CDATA[JVM
JVM生命周期：
虚拟机的启动：
是通过引导类加载器（bootstrap class loader）创建一个初始类（initial class） 来完成的，这个类是由虚拟机的具体实现指定的。
虚拟机的执行：

一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。
程序开始执行时他才运行，程序结束时他就停止。
执行一个所谓的Java程序的时候，真真正正在执行的是一个叫做Java虛拟机的进程。

JVM发展历程
Sun Classic VM

早在1996年Javal.0版本的时候，Sun公]]></description><category></category></item><item><title><![CDATA[设计模式之责任链模式思考题（servlet中filter过滤器是如何实现的？）]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106521431</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106521431</guid><author>qq_40986486</author><pubDate>Wed, 03 Jun 2020 12:06:35 +0800</pubDate><description><![CDATA[对责任链不熟悉的朋友们可以参考我上一篇文章：
设计模式之责任链模式
问题：
servlet中的过滤器是这样的：

如何实现过滤器，使其处理request时是f1,f2,f3,f4的顺序，处理response时的顺序是f4,f3,f2,f1？
解答:
建立新的Resquest,Response类用来模拟请求与响应
class Request{
    String str;
}
class Response{
    String str;
}


修改接口，改为三个参数，第三个为当前的FilterChain]]></description><category></category></item><item><title><![CDATA[设计模式之责任链模式(Chain of Responsibility)]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106501267</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106501267</guid><author>qq_40986486</author><pubDate>Tue, 02 Jun 2020 17:40:03 +0800</pubDate><description><![CDATA[责任链模式
用过tomcat或者springMVC的人应该都对过滤器不陌生吧，过滤器的实现就是责任链模式。
且看如何一步一步推到。话不多说，直接上代码。
//这段代码是实现将骂人词汇过滤：
public class Main {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("djsiaohfioja shit dsjakljf wtf is");
        St]]></description><category></category></item><item><title><![CDATA[设计模式之代理模式（通过字节码探究执行过程）]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106360461</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106360461</guid><author>qq_40986486</author><pubDate>Tue, 26 May 2020 17:15:20 +0800</pubDate><description><![CDATA[代理模式
代理模式的定义:代理模式给某一个对象提供一个代理对象，并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
1、静态代理
我们有一个接口Movable，实现该接口的类都是可移动的：
interface Movable{
    void move();
}

public class Car implements Movable {
    @Override
    public void move() {
        System.out.println("Car ]]></description><category></category></item><item><title><![CDATA[SSM框架整合thymeleaf-spring5模板引擎]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106299826</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106299826</guid><author>qq_40986486</author><pubDate>Sat, 23 May 2020 14:42:28 +0800</pubDate><description><![CDATA[1、pom.xml文件增加依赖：
&lt;!--thymeleaf-spring5 --&gt;
&lt;dependency&gt;
	 &lt;groupId&gt;org.thymeleaf&lt;/groupId&gt;
	 &lt;artifactId&gt;thymeleaf-spring5&lt;/artifactId&gt;
	 &lt;version&gt;3.0.11.RELEASE&lt;/version&gt;
&lt;/dependency&gt;

2、将spring-mvc.x]]></description><category></category></item><item><title><![CDATA[设计模式之工厂模式（简单工厂，工厂方法，抽象方法）]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106278217</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106278217</guid><author>qq_40986486</author><pubDate>Fri, 22 May 2020 13:41:19 +0800</pubDate><description><![CDATA[工厂模式
1、简单工厂模式：
​	首先我们有一个Car类，这个Car可以go：
public class Car {
    public void go() {
        System.out.println("car go ...");
    }
}

还有一个调用者，这样就可以造出车来跑：
public class Main {
    public static void main(String[] args) {
        Car car = new Car();
        c]]></description><category></category></item><item><title><![CDATA[设计模式之策略模式]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106254784</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106254784</guid><author>qq_40986486</author><pubDate>Thu, 21 May 2020 12:58:29 +0800</pubDate><description><![CDATA[策略模式
从comparator与comparable谈起
先从最基本的讲起，定义一个Sorter类，sort方法是选择排序的实现，实现对int数组a排序：
public class Sorter {
    public void sort(int[] a)
    {
        for (int i=0;i&lt;a.length;i++)
        {
            int minPos = i;
            for (int j = i; j &lt; a.leng]]></description><category></category></item><item><title><![CDATA[设计模式之单例模式]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106254760</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106254760</guid><author>qq_40986486</author><pubDate>Thu, 21 May 2020 12:55:29 +0800</pubDate><description><![CDATA[单例模式
单例模式最主要的是将构造器私有化。


饿汉式单例：简单实用，缺点就是有可能浪费空间
public class SingletonPatternDemo02 {
    private static SingletonPatternDemo02 INSTANCE = new SingletonPatternDemo02();

    private SingletonPatternDemo02() { }

    public static SingletonPatternDemo02 get]]></description><category></category></item><item><title><![CDATA[ThreadPoolExecutor执行原理]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106063382</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106063382</guid><author>qq_40986486</author><pubDate>Mon, 11 May 2020 21:50:37 +0800</pubDate><description><![CDATA[线程池
基本概念： 一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。
不要使用Executor创建线程池，而是通过ThreadPoolExecutor的方式创建，这样的处理方式能让编写代码的人更加明确线程池的运行规则，规避资源耗尽的风险。

说明：Executors 返回的线程池对象的弊端如下：
1）FixedThreadPool和SingleThreadPool：
允许请求的队列长度为Interger.MAX_VALUE，可能会堆积大量的请求，从而导致OOM。
2）CachedTh]]></description><category></category></item><item><title><![CDATA[通过几个例子，进一步理解Java的Synchronized锁中对象锁与类锁]]></title><link>https://blog.youkuaiyun.com/qq_40986486/article/details/106051161</link><guid>https://blog.youkuaiyun.com/qq_40986486/article/details/106051161</guid><author>qq_40986486</author><pubDate>Mon, 11 May 2020 12:06:45 +0800</pubDate><description><![CDATA[资源类：电话，有发短信与打电话的功能。
class Phone
{

    public void send() throws InterruptedException 
    {
        TimeUnit.SECONDS.sleep(4);
        System.out.println("发短信");
    }

    public void call()
    {
        System.out.println("打电话");
    }

}

1、电话类中的方法都用s]]></description><category></category></item></channel></rss>