Java
文章平均质量分 63
Java 相关
龙大.
初心未改,方得始终!
展开
-
线程池与垃圾回收(GC)
总之,只有当线程池不再被引用,且内部线程都已经停止或完成了任务,线程池对象才会成为垃圾回收的目标。正确管理线程池的生命周期是防止资源泄露和内存溢出的关键。为了使线程池对象成为垃圾回收的候选对象,应当在不再需要线程池时正确关闭它。如果线程池对象不再被引用,且内部线程都已经停止,垃圾回收器在其下一次运行时将会考虑回收线程池对象。只要线程池对象被应用程序所引用,并且它内部的工作线程还在运行或等待任务,它就不会被垃圾回收器回收。这些方法会启动线程池的关闭序列,停止接收新任务,并尝试终止正在执行的任务。原创 2024-04-09 12:52:18 · 387 阅读 · 0 评论 -
逃逸分析(Escape Analysis)
逃逸分析是一种编译器优化技术,用于确定在程序中对象的作用域和生命周期。编译器通过这种分析可以决定是否可以将对象分配在栈上,而不是在堆上。如果一个对象在定义它的方法之外不可访问,即它不会“逃逸”出方法的范围,那么它可能是一个栈上分配的候选者。逃逸分析的目的是减少内存分配开销、减少垃圾回收的压力,以及提高程序的性能。原创 2024-04-06 09:43:33 · 256 阅读 · 0 评论 -
Java HashMap类各种方法的使用说明
Java中的HashMap类实现了Map接口,提供了键值对映射的存储结构。这使得数据的存取可以通过键(Key)来高效地进行。HashMap位于java.util包中。以下是HashMap。原创 2024-04-06 08:59:42 · 597 阅读 · 0 评论 -
Java List类各种方法的使用说明
Java中的List接口是一个有序的集合,允许我们动态地插入和访问元素。List接口在java.util包中,它有多个实现类,如ArrayListLinkedList等。以下是List。原创 2024-04-06 08:57:20 · 486 阅读 · 0 评论 -
AspectJ 的 5 大通知类型
总结起来,AspectJ 的通知方法参数需要根据切点表达式的需要来指定,不能随意选择参数。这样做是为了确保通知能够正确地织入到目标方法,并访问到所需的数据。在这些示例中,通知方法的参数与目标方法的参数、返回值或异常对象相关联,并且通过切点表达式来指定要绑定的参数。原创 2024-04-04 08:33:13 · 152 阅读 · 0 评论 -
Java Collections.sort 多字段排序的现代实现
这种方式的代码更加简洁和现代,利用了Java 8引入的lambda表达式和方法引用,使得代码更加易于阅读和维护。此外,它也避免了创建匿名内部类的需要。方法添加了一个基于用户年龄的排序规则。这样,我们就创建了一个排序规则链,它首先按照姓名排序,如果姓名相同,则按照年龄排序。方法来创建一个基于用户姓名的Comparator,然后通过。在这个示例中,我们使用了。原创 2024-04-01 12:39:21 · 151 阅读 · 0 评论 -
主进程和子进程的概念
主进程是创建其他进程(子进程)的进程。在操作系统中,主进程通常是启动应用程序的初始进程。原创 2024-03-15 12:55:55 · 472 阅读 · 0 评论 -
Java 服务里调用命令行进行其他操作的几种实现方式对比
总的来说,如果需要一个稳定且功能丰富的库,推荐使用Apache Commons Exec;如果需要快速开发和简洁的API,推荐使用ZT-Exec。对于不需要额外依赖的简单场景,或者需要细粒度控制的场合,ProcessBuilder是一个不错的内置选项。原创 2024-03-15 12:50:29 · 394 阅读 · 0 评论 -
JVM运行时数据区概述以及分别存放的内容
JVM的运行时数据区是JVM在执行Java程序时用于存储数据和状态信息的内存区域。它分为多个部分,每个部分都有其特定的作用和存放的内容。原创 2024-03-10 20:09:16 · 427 阅读 · 0 评论 -
Java 并非所有的对象都放在堆中
尽管存在上述特殊情况,但是在日常的Java应用开发中,大部分对象的生命周期管理和存储都是在堆内存中进行的。在Java中,字符串字面量和其他常量值(如数值、类和接口的引用)会在编译期间被存储在类文件的常量池中。:使用Java本地接口(JNI)技术创建的对象,可能会在Java堆外分配内存,这些对象的生命周期由开发者直接管理,而不是由JVM的垃圾回收器管理。:在某些情况下,如JVM的逃逸分析确定某个对象的作用域不会逃逸出方法之外,那么这个对象可能会被优化为栈上分配,存储在Java栈的局部变量表中。原创 2024-03-10 20:08:59 · 475 阅读 · 0 评论 -
JVM(Java虚拟机)概述
JVM(Java Virtual Machine)是一个能够运行Java字节码的虚拟计算机。它是Java平台的核心组成部分,负责执行编译后的Java程序,提供跨平台运行的能力。JVM使得Java程序可以在任何安装了JVM的操作系统上运行,无需对代码进行修改,实现了"一次编写,到处运行"(Write Once, Run Anywhere)的理念。原创 2024-03-10 19:52:04 · 827 阅读 · 0 评论 -
JVM的各种垃圾回收器(GC)
Serial GC 是用于单线程环境的垃圾回收器,它使用复制算法(Copy)进行年轻代的垃圾回收,而老年代则使用标记-整理(Mark-Compact)算法。Parallel GC(也称为Throughput Collector)是一个并行的垃圾回收器,它在年轻代使用复制算法,在老年代使用标记-整理算法。Shenandoah GC是另一种低暂停时间的垃圾回收器,它与ZGC类似,旨在减少暂停时间,而不是提高吞吐量。ZGC是一种可伸缩的低延迟垃圾回收器,它主要针对大堆内存的系统,并且能够处理数TB级别的堆内存。原创 2024-03-07 12:47:04 · 477 阅读 · 0 评论 -
运行时常量池与栈中的本地变量表的区别
总结来说,运行时常量池和栈中的本地变量表是Java虚拟机中不同的内存区域,它们有着不同的生命周期、存储内容和用途。运行时常量池是类的属性和方法的静态存储区,而本地变量表是方法执行的动态存储区。原创 2024-03-07 12:16:19 · 168 阅读 · 0 评论 -
什么是符号引用?
符号引用是Java虚拟机(JVM)在处理类文件时使用的一种抽象表示,它允许JVM在不同阶段通过解析来动态地定位具体的类成员,这是支持Java动态性(如反射、动态类加载)的关键机制之一。原创 2024-03-07 12:15:17 · 249 阅读 · 0 评论 -
Java虚拟机(JVM)元数据区存放的内容
在Java 8之前,类的元数据信息是存放在永久代(PermGen)中的,但从Java 8开始,永久代被移除,取而代之的是元数据区(Metaspace)。运行时常量池是每个类或接口的常量池表的运行时表示形式,包含了若干种不同的常量,从编译期生成的字面量到方法和字段的引用,这些都会在类加载后进入元数据区的运行时常量池。类的静态变量也被存放在元数据区,因为它们是与类相关的,而不是与类的某个特定实例相关的。此外,元数据区可能还包含了类的加载器信息、类的结构信息、数组信息等。原创 2024-03-06 12:56:24 · 839 阅读 · 0 评论 -
Java 的Executors的默认创建线程池的方法原理及使用场景、优缺点
Java中的线程池是通过Executor框架实现的,Executor框架位于java.util.concurrent包下。线程池的核心是ThreadPoolExecutor类,而Executors类提供的工厂方法都是对ThreadPoolExecutor的封装。原创 2024-03-03 15:35:30 · 942 阅读 · 0 评论 -
HashMap在多线程下形成环的死锁详解
如果另一个线程尝试访问这个已经形成闭环的链表,它将无法成功完成操作,因为它会不断地遍历相同的节点,这就是所谓的死循环。在多线程环境下,HashMap由于没有内置的同步机制,可能会在并发修改时出现链表环,导致死循环和死锁。它存储键值对,并允许使用null键和null值。在扩容过程中,如果两个线程同时进行,由于没有适当的锁机制,它们可能会相互干扰对链表结构的修改。当多个线程同时对HashMap进行写操作时,可能会触发resize操作(即扩容),这个过程涉及到重新计算元素在数组中的位置并重新链接旧链表中的元素。原创 2024-03-01 23:16:38 · 409 阅读 · 0 评论 -
Java 中notify 和 notifyAll 方法介绍
notify() 方法是 Java 中 Object 类的一个方法,它用来唤醒在该对象的监视器(monitor)上等待的单个线程。如果有多个线程都在该对象上等待,则会随机唤醒其中一个线程。被唤醒的线程将会尝试重新获取对象锁,并继续执行原创 2024-03-01 22:59:54 · 429 阅读 · 0 评论 -
Java 的notify 可能导致死锁原因详解
假设有一个共享资源库和。现在有两个线程Thread1和Thread2,它们都需要从资源库中分别获取一种资源才能继续执行。Thread1需要而Thread2需要。资源库提供了等待和通知机制,允许线程在资源不可用时等待,并在资源变为可用时得到通知。原创 2024-03-01 22:53:06 · 394 阅读 · 0 评论 -
类加载器(Class Loader)与双亲委派模型(Parent Delegation Model)
类加载器是Java中用于加载类文件(.class 文件)到Java虚拟机(JVM)中的一部分。它负责将类的字节码转换成Java虚拟机能理解的Class对象。类加载器在Java程序运行期间,负责动态加载、链接和初始化类。原创 2024-03-01 12:57:24 · 901 阅读 · 0 评论 -
Java 的PostConstruct 、PreDestroy的简介
注解用于标记在Bean销毁之前需要执行的清理方法上。原创 2024-01-03 13:01:05 · 405 阅读 · 0 评论 -
Java接口中定义类
Java接口中可以定义嵌套类,这些类默认是public和static的。虽然语言上允许这么做,但在实际应用中,这种做法并不推荐,因为它可能会混淆接口的定义和职责。通常,接口应该只用来定义方法,而具体的类实现应该放在接口之外原创 2024-01-02 12:57:35 · 422 阅读 · 0 评论 -
Java 通配符 ?
通配符?是Java泛型中的一个关键概念,通过其灵活的使用,可以编写出更加通用和类型安全的代码。原创 2024-01-01 22:54:44 · 475 阅读 · 0 评论 -
上界通配符(? extends Type)
? extends Type通配符的使用提高了代码的灵活性,它允许你编写能够接受更多子类型集合的泛型方法,同时保证了从这些集合中提取元素的类型安全。这是PECS原则中的“Producer Extends”部分,适用于你的集合是提供或生产元素的情况。在遍历这样的集合时,可以直接处理Type类型的元素,无需担心类型转换的问题。原创 2024-01-01 22:51:22 · 662 阅读 · 0 评论 -
下界通配符(? super Type)
? super Type通配符的使用提高了代码的灵活性,它允许你编写能够接受更广泛类型集合的泛型方法,同时保证了向这些集合中添加元素的类型安全。这是PECS原则中的“Consumer Super”部分,适用于你的集合是消费或接受元素的情况。在遍历这样的集合时,通常需要将元素视为最通用的类型(如Object),除非进行显式的类型转换。原创 2024-01-01 22:40:59 · 656 阅读 · 0 评论 -
Synchronized、ReentrantLock 和 ReadWriteLock底层原理
Synchronized、ReentrantLock 和 ReadWriteLock 都是用于实现线程同步的机制,但它们的实现原理和适用场景有所不同。synchronized 是基于 JVM 实现的内置锁机制,而 ReentrantLock 和 ReadWriteLock 是基于 Java API 层面,通过 AQS 框架来实现更复杂的锁操作和同步控制。原创 2023-12-28 12:44:06 · 373 阅读 · 0 评论 -
Synchronized、ReentrantLock、ReadWriteLock 介绍
是包中的一个类,它提供了比 synchronized 更多的功能。是一个接口,它包含一对锁,一个读锁和一个写锁,通过分离读和写操作来提高并发性能。原创 2023-12-27 13:09:47 · 489 阅读 · 0 评论 -
ReentrantLock vs synchronized
ReentrantLock 提供了比 synchronized 更多的功能和更大的灵活性。例如,ReentrantLock 支持尝试锁定(tryLock),公平锁定,锁定中断,以及与条件变量(Condition)一起使用等。这些功能在复杂的同步控制场景中非常有用。原创 2023-12-27 12:55:03 · 340 阅读 · 0 评论 -
Java 接口默认方法和静态方法
Java 8 引入的新特性默认方法:Java 8(发布于2014年3月)开始,接口中可以定义带有实现的方法,称为默认方法(Default Methods)。静态方法:同样从Java 8开始,接口还可以定义静态方法。原创 2023-12-26 12:47:50 · 415 阅读 · 0 评论 -
Java 反射相关知识点
ReflectionData 通常指的是在编程中,尤其是在使用反射(Reflection)时,关于类、对象、方法和字段的元数据信息。在 Java 中,反射机制允许程序在运行时获取这些数据,并对其进行操作。其中就包括如下信息:在 Java 反射中,"声明的字段" 指的是在类中定义的所有字段,无论它们的访问修饰符如何(private、protected、默认(包访问)或 public)。原创 2023-12-21 13:00:02 · 374 阅读 · 0 评论 -
Jackson与Gson的比较
选择Jackson还是Gson,取决于具体的项目需求。如果需要高性能和高度的可定制性,Jackson可能是更好的选择。如果项目需要轻量级的库,或者与Google的其他服务有紧密的集成,Gson可能更合适。在实际使用中,两者都是成熟的库,能够为Java应用提供可靠的JSON处理能力原创 2023-12-20 12:45:56 · 648 阅读 · 1 评论 -
SimpleDateFormat 多线程不安全原因
即使SimpleDateFormat使用了static和final修饰符,由于其内部状态可变,它仍然不是线程安全的。在多线程环境中应该采取其他措施以确保日期时间的正确解析和格式化。原创 2023-12-18 12:45:22 · 366 阅读 · 0 评论 -
YYYY-MM-dd 与 yyyy-MM-dd 的区别以及跨年问题
大写的YYYY通常用于表示“周年”,在某些编程语言或者数据格式中,比如ISO 8601日期格式中,YYYY可能代表的是所在周属于的年份。这意味着,如果一周跨越了两个不同的年份,该周会被归属到哪一年取决于这周中的大部分日子属于哪一年。原创 2023-12-18 12:35:27 · 1535 阅读 · 0 评论 -
注解 @Resource 与 @Autowired 比较
@Resource和@Autowired都是用于依赖注入的注解,但它们属于不同的规范和框架。@Resource注解更加通用,适用于任何遵循Java EE规范的环境,而@Autowired注解则是Spring框架中的特性,提供了更加灵活的依赖注入方式。开发者可以根据应用程序的具体需求和所使用的技术栈来选择合适的注解。原创 2023-12-15 18:34:47 · 431 阅读 · 0 评论 -
ArrayList 多线程操作的问题
这些问题的根本原因在于 ArrayList 不是线程安全的。在 Java 集合框架中,ArrayList 的设计没有考虑同步机制,这意味着当多个线程对其进行操作时,并没有内置的方法来防止竞争条件或保证线程安全。原创 2023-12-08 13:14:31 · 650 阅读 · 0 评论 -
CompletableFuture 异常抛出机制
是 Java 8 引入的 CompletableFuture 类的一个实例,它表示一个异步计算的结果。),异常才会被抛出或处理。如果你不尝试获取结果或处理异常,中的异常可能会被忽略,并且不会影响调用者线程的执行流程。在所有这些情况中,只有当你试图获取。),或者当你显式地处理异常(如通过。原创 2023-12-08 12:18:24 · 935 阅读 · 0 评论 -
单例模式(Singleton)
使用条件: 当系统中只需要某个类的唯一对象时,可以使用该模式。 为什么会用到该模式?:因为有时候某些对象的创建需要耗费大量的资源、使用单一(唯一)的对象实例来维护某些共享数据等,在这些场景下即可采用单例模式进行设计,可以适当地渐少内存开销,因为此时该唯一对象不会(被限制了)频繁地创建。第一种:饱汉模式public class SingleTon{原创 2015-09-27 16:45:23 · 397 阅读 · 0 评论 -
java的四个访问控制符
java的四个访问控制符:public ,protected,default(默认),private原创 2015-09-27 14:47:18 · 524 阅读 · 0 评论 -
Java中常量和静态变量区别详解
Java中常量和静态变量区别详解原创 2015-09-27 14:50:35 · 1708 阅读 · 0 评论 -
java中的sleep()与wait()区别
1、对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。 2、sleep()方法导致了程序暂停执行指定的时间,让出cpu給其他线程,但是他的监控状态依然保持着,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁。而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定原创 2015-11-04 09:39:55 · 331 阅读 · 0 评论