<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Andrew_Lgx的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Andrew_Lgx</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Andrew_Lgx]]></copyright><item><title><![CDATA[2 Spring控制反转(IOC)]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130330170</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130330170</guid><author>Andrew_Lgx</author><pubDate>Thu, 27 Apr 2023 16:09:05 +0800</pubDate><description><![CDATA[Spring简介与IOC容器首先IoC：意思是“控制反转”，是Inversion of Control的简写控制什么：控制对象的创建和销毁，指的是控制对象的生命周期。反转什么：之前我们创建一个对象都是new，现在有了IOC了，指的是把对象的控制权交给了IOC容器。容器用于存放Bean对象，Bean对象就是通过Spring框架创建的java对象。没用Spring之前是通过代码new创建对象，现在交给Spring框架创建，并完成对象初始化，以及建立对象之间的依赖。]]></description><category></category></item><item><title><![CDATA[1.4 线程的状态和基本操作]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130179694</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130179694</guid><author>Andrew_Lgx</author><pubDate>Sun, 23 Apr 2023 14:58:37 +0800</pubDate><description><![CDATA[首先本质上 wait 和 notify 是用于线程之间通信的，wait() 表示当前获取到锁的线程进入休眠状态并释放锁，notify() 表示当前获取到锁的线程去唤醒曾经获取到该锁的 wait() 的休眠线程，这里有一个很关键的点，就是他们通信的基础是获得或者曾经获得的是同一个锁而在 Java 中，锁是放在对象上的，所以可以说这两个线程的通信要依赖于这个对象才行，如果不放在对象上，也可以用 Thread.wait( Object o) 把对象传递进去，但是从设计的角度来说，还不如把方法直接放在对象上。]]></description><category></category></item><item><title><![CDATA[1.3 创建线程的四种方式]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130171857</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130171857</guid><author>Andrew_Lgx</author><pubDate>Sun, 16 Apr 2023 10:20:07 +0800</pubDate><description><![CDATA[Callable是实现多线程编程的接口，只有一个call()方法，用于执行异步任务并返回一个泛型对象，可以通过Future获取线程执行的结果。Future是一个接口，用于表示一个异步任务计算的结果，常见的Future接口的实现类有FutureTask、CompletableFuture等。Future对象，可以通过get()方法来获取异步任务的执行结果。如果任务还没有执行完成，get()方法会阻塞，直到任务执行完成并返回结果。]]></description><category></category></item><item><title><![CDATA[1.2 线程和进程区别]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130093124</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130093124</guid><author>Andrew_Lgx</author><pubDate>Tue, 11 Apr 2023 20:57:01 +0800</pubDate><description><![CDATA[线程和进程都是操作系统中的概念，用于描述正在运行的程序的执行状态。进程和线程都是操作系统的基本概念，进程是计算机中运行的程序的一个实例，线程是进程中的一个执行流。进程有自己独立的内存空间和系统资源，进程之间相互独立，互相隔离。线程共享进程的内存空间和系统资源，多个线程可以在同一时间内执行不同的任务。线程的切换和创建的代价比进程要小得多，因此线程的并发度和性能比进程更高。]]></description><category></category></item><item><title><![CDATA[1.1什么是多线程，多线程的优劣？]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130092254</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130092254</guid><author>Andrew_Lgx</author><pubDate>Tue, 11 Apr 2023 20:45:44 +0800</pubDate><description><![CDATA[每个线程都有自己的执行栈和程序计数器，但它们共享程序的代码段、静态数据、堆和方法区等资源。综上所述，多线程的优点在于提高程序性能、充分利用多核处理器、支持异步编程、提高程序可伸缩性、支持更高的并发度和实现复杂业务逻辑。但同时也存在一些缺点，如线程安全问题、调试和测试困难、线程间的通信和同步、资源占用和调度开销等。：多线程程序需要占用更多的系统资源和内存，线程的调度和切换也会带来一定的开销。：多线程程序需要考虑线程间的通信和同步，编写更复杂的程序逻辑和代码。]]></description><category></category></item><item><title><![CDATA[1.1并行和并发有什么区别？]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130089873</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130089873</guid><author>Andrew_Lgx</author><pubDate>Tue, 11 Apr 2023 17:58:47 +0800</pubDate><description><![CDATA[在多核处理器上，每个任务可以在不同的 CPU 核心上并行执行，从而提高程序的运行速度。例如，一个大型的图像处理程序可以将图片分成多个部分，每个部分在不同的 CPU 核心上并行处理，从而提高处理速度。在单核处理器上，多个任务使用时间片轮换方式来共享 CPU 时间，看起来像是同时执行。例如，在一个 Web 服务器上，多个客户端同时发送请求，服务器可以并发地处理多个请求。并发通常是为了提高系统的吞吐量和资源利用率，而并行则是为了加快单个任务的处理速度。并发是指多个任务在同一时间段内。]]></description><category></category></item><item><title><![CDATA[1.1并发编程三要素是什么？]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130089523</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130089523</guid><author>Andrew_Lgx</author><pubDate>Tue, 11 Apr 2023 17:46:45 +0800</pubDate><description><![CDATA[同时，在编写并发程序时，需要遵循并发编程的最佳实践，如避免共享变量、减少锁的粒度、避免死锁等。：可见性指的是多个线程之间对共享变量的修改是可见的。在并发编程中，如果一个线程修改了共享变量的值，其他线程可能无法立即看到这个变化，从而出现数据不一致的问题。：原子性指的是一个操作是不可中断的，即要么操作全部完成，要么操作完全没有执行。：有序性指的是程序执行的顺序是按照代码的顺序执行的。在并发编程中，由于多个线程之间的执行是异步的，所以程序的执行顺序可能会发生变化，从而导致程序出现错误。]]></description><category></category></item><item><title><![CDATA[1.1 并发编程的优缺点]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130084143</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130084143</guid><author>Andrew_Lgx</author><pubDate>Tue, 11 Apr 2023 15:17:17 +0800</pubDate><description><![CDATA[由于并发编程涉及多个线程之间的相互依赖和同步，容易导致死锁和饥饿现象，需要采用合适的同步机制和算法来避免这些问题的发生。：并发编程需要多个线程同时运行，对CPU和内存等硬件资源的要求较高，需要合理地配置硬件资源来保证程序的运行效率。：Java并发编程可以使用异步编程模型，允许程序在等待I/O操作完成时不会阻塞线程，从而提高程序的并发性。：Java并发编程需要考虑多个线程之间的同步、竞态条件等问题，因此并发编程的复杂度要比单线程编程高得多。]]></description><category></category></item><item><title><![CDATA[6.3 什么是类加载器，类加载器有哪些?]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130070201</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130070201</guid><author>Andrew_Lgx</author><pubDate>Mon, 10 Apr 2023 21:22:17 +0800</pubDate><description><![CDATA[即当一个类加载器收到加载请求时，它首先会将这个请求委派给父类加载器去处理，只有在父类加载器无法处理时，才由自己来加载类。这样可以避免同一个类被不同的类加载器加载多次，从而保证了类的唯一性。Java虚拟机可以同时使用多个类加载器，每个类加载器负责加载一些特定的类。：用来加载Java的核心类库，位于JRE的lib目录下，是虚拟机的一部分，是由C++实现的，不是Java类。：开发人员可以根据自己的需要编写自己的类加载器，来实现一些特定的需求，例如加载网络上的类文件等。]]></description><category></category></item><item><title><![CDATA[6.1简述java类加载机制?]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130069068</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130069068</guid><author>Andrew_Lgx</author><pubDate>Mon, 10 Apr 2023 20:30:41 +0800</pubDate><description><![CDATA[Java类加载机制是指JVM在运行时将类的.class文件加载到内存中，并对其进行验证、准备、解析、初始化等一系列操作的过程。此外，JVM还提供了双亲委派模型来保证类加载的顺序和一致性，即先由父类加载器尝试加载类，如果无法加载再由子类加载器加载。需要注意的是，类的加载机制是延迟加载的，即在程序运行过程中，只有使用到某个类时，JVM才会将它加载到内存中。：执行类的初始化代码，包括静态变量赋值、静态块执行等。：将符号引用转换为直接引用，即将类、方法、字段等的引用转换为直接指向内存中的实际对象。]]></description><category></category></item><item><title><![CDATA[5.1 简述java内存分配与回收策率以及Minor GC和Major GC]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130065583</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130065583</guid><author>Andrew_Lgx</author><pubDate>Mon, 10 Apr 2023 17:36:30 +0800</pubDate><description><![CDATA[对象首先会被分配在Eden区，当Eden区满时，会触发Minor GC，将存活的对象复制到Survivor区或老年代中，并清空Eden区和使用过的Survivor区。在这个过程中，可能会出现对象晋升的情况，即从新生代晋升到老年代。2 回收的速度不同：Minor GC通常比Major GC快，因为新生代中的对象通常比较少，而且使用的是复制算法，回收速度较快。3 对应用程序的影响不同：Minor GC通常只会短暂地停止应用程序的运行，而Major GC则可能会停止应用程序更长的时间，因为它涉及的对象较多。]]></description><category></category></item><item><title><![CDATA[4.13 简述分代垃圾回收器是怎么工作的？]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130064539</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130064539</guid><author>Andrew_Lgx</author><pubDate>Mon, 10 Apr 2023 17:31:31 +0800</pubDate><description><![CDATA[当Eden区满时，触发一次Minor GC，将存活的对象复制到另一个Survivor区，同时清空Eden区和使用过的Survivor区。当某个Survivor区也满时，会将存活的对象复制到另一个空闲的Survivor区或者老年代，同时清空使用过的Survivor区。分代垃圾回收器的工作原理是通过将对象按照生命周期分配到不同的代中，针对不同代采用不同的垃圾回收策略，以提高垃圾回收效率和应用性能。标记-清除算法会先标记所有存活的对象，然后清除所有未标记的对象，但这可能会导致内存碎片化问题。]]></description><category></category></item><item><title><![CDATA[4.12 新生代垃圾回收器和老年代垃圾回收器都有哪些？有什么区别？]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130062847</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130062847</guid><author>Andrew_Lgx</author><pubDate>Mon, 10 Apr 2023 16:15:08 +0800</pubDate><description><![CDATA[总的来说，新生代垃圾回收器主要是为了快速回收短时间存活的对象，而老年代垃圾回收器则主要是为了回收长时间存活的对象。，主要针对响应时间优先的应用，垃圾回收和应用程序并发执行，可以减少停顿时间，但可能会导致碎片化问题。，主要针对单CPU环境，采用标记-整理算法，垃圾回收时只有一个线程执行，容易造成较长的停顿时间。，采用复制算法，主要针对吞吐量优先的应用，多线程执行垃圾回收，但不能保证最短的停顿时间。，是最简单的垃圾回收器，采用复制算法，单线程执行，适用于小内存环境。]]></description><category></category></item><item><title><![CDATA[4.11 详细介绍一下 CMS 垃圾回收器？]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130062607</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130062607</guid><author>Andrew_Lgx</author><pubDate>Mon, 10 Apr 2023 16:10:45 +0800</pubDate><description><![CDATA[不过，需要注意的是，由于 CMS 垃圾回收器可能会导致内存碎片的问题，因此对于需要长时间运行的应用程序，可能需要定期执行 Full GC（全局垃圾回收）以避免内存碎片问题影响性能。CMS 垃圾回收器的主要缺点是，在进行垃圾回收时需要占用大量的 CPU 资源，因此可能会影响应用程序的吞吐量。此外，由于 CMS 垃圾回收器采用的是标记-清除算法，因此可能会导致内存碎片的问题，进而影响应用程序的性能。CMS 垃圾回收器的主要优点是可以在应用程序运行的同时进行垃圾回收，因此对应用程序的响应时间影响较小。]]></description><category></category></item><item><title><![CDATA[4.10 说一下 JVM 有哪些垃圾回收器？]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130061920</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130061920</guid><author>Andrew_Lgx</author><pubDate>Mon, 10 Apr 2023 15:47:45 +0800</pubDate><description><![CDATA[它是JDK11中新引入的一种垃圾回收器，以获取最短回收停顿时间为目标，可以在不超过10ms的停顿时间内进行全堆垃圾回收，适用于超大型的内存应用场景。：它是一种以获取最短回收停顿时间为目标的垃圾回收器，使用分代收集算法进行垃圾回收，在回收过程中只暂停少量的应用线程，适用于大型的内存应用场景。：它是一种以获取最短回收停顿时间为目标的垃圾回收器，使用多线程进行垃圾回收，在回收过程中只暂停少量的应用线程，适用于响应时间敏感的应用场景。]]></description><category></category></item><item><title><![CDATA[4.9 说一下 JVM 有哪些垃圾回收算法？]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130056580</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130056580</guid><author>Andrew_Lgx</author><pubDate>Mon, 10 Apr 2023 12:14:35 +0800</pubDate><description><![CDATA[这样，在新的区域中，存活对象的地址是连续的，从而可以很方便地进行内存分配。需要注意的是，标记-整理算法中需要大量的移动对象操作，因此它的性能通常比复制算法差一些，尤其是在老年代的内存回收中。在标记阶段，垃圾回收器会从根对象（通常是一些全局变量）开始遍历程序的对象图，标记所有可达对象，即所有可以从根对象到达的对象，而不可达的对象则被视为垃圾。分代算法的优点是可以充分利用对象生命周期的特点，将不同生命周期的对象放在不同的代中，对每个代采用不同的垃圾回收算法，提高了垃圾回收效率。]]></description><category></category></item><item><title><![CDATA[4.7 在Java中，对象什么时候可以被垃圾回收]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130056299</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130056299</guid><author>Andrew_Lgx</author><pubDate>Mon, 10 Apr 2023 11:32:38 +0800</pubDate><description><![CDATA[如果一个对象只被弱引用或软引用所引用，那么它就可以被垃圾回收。弱引用和软引用是 Java 中的两种特殊的引用类型，它们不会阻止对象被垃圾回收。：如果一个对象没有任何引用指向它，那么它就可以被垃圾回收。可以通过将引用置为 null 来手动释放对象占用的内存。：如果 JVM 中的内存不足，那么垃圾回收器就会被触发，回收一些不再使用的对象，释放内存空间。]]></description><category></category></item><item><title><![CDATA[4.8 JVM中的永久代中会发生垃圾回收吗]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130048718</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130048718</guid><author>Andrew_Lgx</author><pubDate>Sun, 09 Apr 2023 21:54:15 +0800</pubDate><description><![CDATA[不过，即使在 JDK 8 之前，JVM 的永久代中也有可能发生垃圾回收。如果使用了大量的动态代理、反射、代码生成等技术，会导致永久代中产生大量的无用类，从而导致永久代的内存溢出。在这种情况下，JVM 会触发 Full GC，尝试回收永久代中的无用类，以释放内存空间。在 JDK 8 及之前的版本中，JVM 中的永久代是存放类信息、常量、静态变量等的区域，不会被垃圾回收。这是因为永久代使用的是永久代内存，不属于堆内存，不受垃圾回收机制的管理。元空间使用的是本地内存，也不属于堆内存，也不会被垃圾回收。]]></description><category></category></item><item><title><![CDATA[4.5 Java 中都有哪些引用类型？]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130047768</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130047768</guid><author>Andrew_Lgx</author><pubDate>Sun, 09 Apr 2023 20:59:05 +0800</pubDate><description><![CDATA[虚引用不能直接通过 get() 方法访问到它所指向的对象，它主要用于在对象被垃圾回收时收到一个系统通知，或者在一个对象被销毁时进行一些清理工作。软引用可以用来实现缓存等功能，当内存不足时，缓存中的对象可以被回收，避免了 OutOfMemoryError 错误。（Weak Reference）：弱引用是一种比软引用更弱化的引用类型。（Strong Reference）：指向对象的引用是强引用，它是默认的引用类型，如果一个对象具有强引用，那么垃圾回收器不会回收这个对象，即使 JVM 内存不足也不会回收。]]></description><category></category></item><item><title><![CDATA[4.3 垃圾回收的优点和原理]]></title><link>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130045084</link><guid>https://blog.youkuaiyun.com/Andrew_Lgx/article/details/130045084</guid><author>Andrew_Lgx</author><pubDate>Sun, 09 Apr 2023 20:58:05 +0800</pubDate><description><![CDATA[1 标记-清除算法：这是垃圾回收最基本的算法，它通过标记所有可以访问的内存，然后清除所有不能访问的内存。在标记阶段，垃圾回收器会标记所有可以访问的内存，并且将存活的对象移到存活区的一端。在整理阶段，垃圾回收器会将存活对象移到存活区的一端，并且将存活区和空闲区合并，从而避免内存碎片的产生。1 简化程序员的工作：垃圾回收可以自动地回收不再使用的内存，从而减轻了程序员手动管理内存的工作量。4 改善程序的性能：尽管垃圾回收会带来一定的性能开销，但由于它可以避免内存泄漏等问题，从而改善了程序的性能。]]></description><category></category></item></channel></rss>