- 博客(88)
- 收藏
- 关注
原创 JVM的几种常见垃圾回收算法
引言:Java Virtual Machine(JVM)作为Java程序运行的核心,其垃圾回收(Garbage Collection, GC)机制在内存管理中起着至关重要的作用。垃圾回收算法是JVM性能优化的重要方面。本文将详细介绍几种常见的垃圾回收算法,包括标记-清除(Mark-and-Sweep)、复制(Copying)、标记-整理(Mark-and-Compact)、分代收集(Generational Collection)和G1(Garbage-First)等。
2024-06-09 16:58:27 983
原创 JVM中的内存区域划分
Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用来存放编译器生成的各种字面量和符号引用,这部分内容将在类加载后存放在方法区的运行是常量池中。Java虚拟机对class文件的每一部分的格式都有严格的规定,每个字节用于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载和执行。HotSpot VM把GC分代收集拓展至方法区,即使用Java堆的永久代来实现方法区,这样HotSpot的垃圾收集器就可以像管理Java堆一样管理这部分内存。的最重要的一块内存区域。
2024-05-18 14:59:12 606
原创 TCP的面向字节流和粘包问题
其中,消息边界标记是一种常见且简单的解决方法,即在每条消息的末尾添加特定的分隔符,如换行符(\n),接收端根据分隔符来识别消息的边界。TCP是一种面向字节流的协议,它将数据视为连续的字节流,而不是分割成消息。粘包问题通常发生在发送端连续发送多个小数据包时,由于TCP底层的数据传输机制,这些数据包可能会被合并成一个大的数据包,然后一次性发送给接收端,从而导致粘包问题的出现。在这个示例中,客户端在每条消息的末尾添加了换行符(\n),接收端可以根据换行符来识别消息的边界,从而正确解析数据,避免了粘包问题的出现。
2024-05-11 19:35:05 1023
原创 TCP的延时应答和捎带应答详解
延时应答是指TCP接收方在接收到数据包后,并不立即发送确认(ACK)消息,而是等待一段时间,以期望在该时间段内收到更多的数据包,从而实现合并多个ACK消息为一个,减少网络中的确认消息数量,提高网络利用率。捎带应答是指TCP发送方在发送数据包时,如果此时正好有确认消息需要发送,则将确认消息捎带在数据包中一起发送,从而减少网络中的确认消息数量,提高网络利用率。在这个示例中,服务器端在接收到消息后延迟1秒才发送确认消息,这样做的目的是为了等待可能在1秒内到达的更多数据包,并合并多个ACK消息。
2024-05-11 19:26:11 428 2
原创 TCP流量控制和拥塞控制详解
一条TCP连接的每一侧主机都为该连接设置了接收缓存。当该TCP连接接收到正确的、有序的报文段,就会将数据放入接收缓存。相关联的应用会从缓存中读取数据。如果发送者发送数据过快、过多,而接收方的应用程序从缓冲区读取的速度较慢,就会导致缓冲区溢出为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制流量控制根本目的是防止分组丢失,使得发送速率与接收速率相匹配流量控制引发的死锁?怎么避免死锁的发生?当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。
2024-05-11 19:22:48 800
原创 TCP滑动窗口详解
滑动窗口通俗来讲就是一种流量控制技术。它本质上是描述接收方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据,如果发送方收到接收方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接收方发送窗口大小不为0的数据报的到来。
2024-05-10 22:42:34 954
原创 详解TCP 四次挥手
当Server端也发送了FIN报文段时,这个时候就表示Server端也没有数据要发送了,就会告诉Client端,我也没有数据要发送了,之后彼此就会愉快的中断这次TCP连接。由于TCP连接是全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。其中ACK报文是用来应答的,SYN报文是用来同步的。
2024-05-10 21:24:11 798
原创 详解TCP 三次握手
我们假设client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。所以,采用“三次握手”的办法可以防止上述现象发生。
2024-05-10 21:22:57 738
原创 TCP超时重传机制
TCP超时重传机制是指当发送端发送数据后,如果在一定时间内未收到接收端的确认应答,则会认为数据丢失或损坏,从而触发重传机制。发送端会重新发送数据,并等待确认应答。如果在多次重传后仍未收到确认应答,则会放弃发送,并报告连接异常。
2024-05-10 21:16:00 882
原创 TCP协议的确认应答机制
TCP协议通过确认应答机制来保证数据的可靠传输。发送端将数据分割成合适大小的报文段,并发送给接收端。接收端收到数据后,会发送一个确认报文给发送端,告知发送端已成功接收到数据。如果发送端在一定时间内未收到确认报文,则会认为数据丢失或损坏,并触发重传机制。
2024-05-10 21:10:58 327
原创 用信号量解决哲学家进餐问题
哲学家进餐问题是一个经典的并发编程问题,它涉及到一群哲学家坐在圆桌周围进餐。每个哲学家都必须完成两个任务:思考和就餐。他们之间共享一些餐具,如叉子,但每个哲学家在就餐时需要同时拿到左手和右手的叉子。如果某个哲学家左右两边的叉子都被其他哲学家拿走了,那么他就无法进餐,就会陷入饥饿状态,最终可能导致死锁。
2024-04-05 09:00:00 483
原创 详解TCP/IP五层模型
TCP/IP模型是一个网络通信体系结构,由五层组成,每一层都有其特定的功能。应用层传输层网络层数据链路层物理层每一层都有不同的责任,通过这种层次结构,网络通信可以更有效地进行。
2024-04-04 13:59:53 9203 1
原创 File类详解
在Java编程中,File类是用于表示文件系统中的文件或目录的抽象表示。它提供了一种用于访问和操作文件系统的方式。本文将详细介绍Java中的File类,包括其属性、构造方法、常用方法,并提供相关的代码示例。
2024-04-02 13:18:12 571
原创 了解Java文件操作和IO
引言:在Java编程中,文件操作是一项基本且常见的任务。无论是读取、写入还是管理文件,Java都提供了丰富的API和工具来简化这些操作。本文将深入探讨Java中的文件操作,并举例说明如何使用Java来处理文件。
2024-04-02 13:02:21 404
原创 Java中的信号量Semaphore
信号量Semaphore是一种用于控制多个线程访问共享资源的同步工具。它通过维护一个计数器来控制对共享资源的访问,当资源被一个线程占用时,计数器减一;当资源被释放时,计数器加一。当计数器为0时,表示资源已被全部占用,新的线程需要等待其他线程释放资源。
2024-04-01 22:56:38 581
原创 详解ExecutorService 和 Executors
代码示例:代码示例:ExecutorService 表⽰⼀个线程池实例.Executors 是⼀个⼯⼚类, 能够创建出⼏种不同⻛格的线程池.ExecutorService 的 submit ⽅法能够向线程池中提交若⼲个任务.Executors 创建线程池的⼏种⽅式newFixedThreadPool: 创建固定线程数的线程池newCachedThreadPool: 创建线程数⽬动态增⻓的线程池.newSingleThreadExecutor: 创建只包含单个线程的线程池.
2024-04-01 22:52:25 617
原创 CAS 的 ABA 问题
线程 t1 的 CAS 是期望 num 不变就修改. 但是 num 的值已经被 t2 给改了. 只不过⼜改成 A 了. 这个时候 t1 究竟是否要更新 num 的值为 Z 呢?但是, 在 t1 执⾏这两个操作之间, t2 线程可能把 num 的值从 A 改成了 B, ⼜从 B 改成了 A。轮到线程2 执⾏了, 发现当前存款为 100, 和之前读到的 100 相同, 再次执⾏扣款操作。轮到线程2 执⾏了, 发现当前存款为 50, 和之前读到的 100 不相同, 执⾏失败.这个时候, 扣款操作被执⾏了两次!
2024-03-31 22:56:03 537
原创 详解CAS(Compare and swap)
一、什么是 CAS一、什么是 CASCAS: 全称Compare and swap,字⾯意思:”⽐较并交换“,⼀个 CAS 涉及到以下操作:我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。比较 A 与 V 是否相等。(⽐较)如果⽐较相等,将 B 写⼊ V。(交换)返回操作是否成功。CAS 伪代码下⾯写的代码不是原⼦的, 真实的 CAS 是⼀个原⼦的硬件指令完成的. 这个伪代码只是辅助理解 CAS的⼯作流程.两种典型的不是 "原⼦性" 的代码。
2024-03-31 22:43:44 968
原创 Java中常见的锁策略
乐观锁 vs 悲观锁悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别⼈会修改,所以每次在拿数据的时候都会上锁,这样别⼈想拿这个数据就会阻塞直到它拿到锁。乐观锁:假设数据⼀般情况下不会产⽣并发冲突,所以在数据进⾏提交更新的时候,才会正式对数据是否产⽣并发冲突进⾏检测,如果发现并发冲突了,则让返回⽤⼾错误的信息,让⽤⼾决定如何去做。举个栗⼦: 同学 A 和 同学 B 想请教⽼师⼀个问题.
2024-03-31 22:29:58 755
原创 Java 线程池
引言:在 Java 编程中,线程池是一种重要的多线程处理机制,它可以有效地管理和复用线程,提高了多线程程序的性能和可靠性。本文将详细介绍 Java 中线程池的概念、好处,并演示如何自己实现一个简单的线程池。
2024-03-31 16:24:17 428
原创 Java 中的单例模式
引言:在 Java 编程中,单例模式是一种常见的设计模式,它保证一个类只能创建一个实例,并提供一个全局访问点。单例模式在很多场景下都非常有用,比如线程池、日志系统、数据库连接池等。本文将详细介绍 Java 中单例模式的实现方式,并通过示例说明其在实际应用中的应用场景。
2024-03-31 15:33:20 1239
原创 详解Java 中的 wait 和 notify 方法
wait(): 当一个线程执行了wait()方法后,它会释放当前持有的对象锁,并进入等待状态,直到其他线程调用了相同对象上的notify()或方法将其唤醒。notify(): 用于唤醒一个正在等待的线程。调用notify()方法会随机唤醒等待队列中的一个线程,并使其从wait()方法返回。: 用于唤醒所有正在等待的线程。调用方法会唤醒等待队列中的所有线程,使它们从wait()方法返回。wait()和notify()方法是 Java 多线程编程中非常重要的工具,能够实现线程间的协作和通信。
2024-03-31 15:12:54 561
原创 详解 Java 中的 volatile 关键字
volatile 能保证内存可见性引言:在 Java 编程中,volatile是一个非常重要的关键字,用于修饰变量。它主要用于确保多个线程之间对共享变量的修改能够被及时地更新到主内存,并且能够保证可见性。然而,需要注意的是,volatile关键字并不具备原子性,这就意味着在某些情况下,仅仅使用volatile是不足够的。本文将深入探讨volatile关键字的使用及其特性。
2024-03-31 14:43:51 966
原创 详解 Java多线程带来的的风险-线程安全
线程安全是指在多线程环境中,对共享资源的访问不会导致数据的损坏或不一致。一个线程安全的程序在多线程环境下执行时,能够确保各个线程都能正确地操作共享的数据,而不会产生意外结果。
2024-03-31 14:08:48 1529
原创 滑动窗口算法详解及应用示例
引言:滑动窗口算法是一种用于解决数组/字符串问题的有效技巧。它可以用来解决一系列问题,例如求解子数组/子字符串的最大值、最小值、平均值、和、特定条件下的个数等。在本篇博客中,我们将详细介绍滑动窗口算法的原理,并通过几个具体的题目示例来加深理解。
2024-03-30 13:32:18 790
原创 Thread 类及常见方法
引言:Thread 类是 JVM ⽤来管理线程的⼀个类,换句话说,每个线程都有⼀个唯⼀的 Thread 对象与之关联。每个执⾏流,也需要有⼀个对象来描述,⽽ Thread 类的对象 就是⽤来描述⼀个线程执⾏流的,JVM 会将这些 Thread 对象组织起来,⽤于线程调度,线程管理。
2024-03-30 13:04:53 1022
原创 认识线程(Thread)
引言:在Java编程中,线程(Thread)是一项重要的概念,它使得程序能够同时执行多个任务,提高了程序的效率和响应速度。本文将介绍Java线程的基本概念、创建方式以及多线程的优势。一、概念1、 线程是什么⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代码. 多个线程之间 "同时" 执⾏着多份代码。2、为啥要有线程?⾸先,"并发编程" 成为 "刚需"。单核 CPU 的发展遇到了瓶颈. 要想提⾼算⼒, 就需要多核 CPU. ⽽并发编程能更充分利⽤多核 CPU资源.
2024-03-27 22:30:24 836
原创 快速幂算法在Java中的应用
快速幂算法,也称为二分幂算法,通过将指数进行二进制拆分,从而减少幂运算的次数,从而提高计算效率。其基本思想是利用指数的二进制表示来降低计算时间复杂度,使得幂运算的时间复杂度从O(n)降低到O(logn)。
2024-03-27 21:53:54 698
原创 泛型的通配符及擦除机制详解
一、引言:在这篇文章中,我主要介绍前一篇泛型没介绍完整的泛型通配符?用于在泛型的使用,即为通配符一、以上程序会带来新的问题,如果现在泛型的类型设置的不是String,而是Integer.我们需要的解决方案:可以接收所有的泛型类型,但是又不能够让用户随意修改。这种情况就需要使用通配符""来 处理示例:使用通配符。
2024-03-26 12:37:05 417
原创 详解Java 中的 Lambda 表达式
/ 使用 Lambda 表达式实现自定义 Comparator// 打印排序后的结果通过以上例子,我们可以看到 Lambda 表达式在简化代码、提高代码可读性方面的优势。在实际开发中,Lambda 表达式可以大大简化代码编写,提升开发效率。总结:Lambda 表达式是 Java 8 中一个重要的特性,它使得 Java 支持函数式编程风格,让代码更加简洁、易读。通过 Lambda 表达式,我们可以更加方便地实现函数式接口和简化代码,提高开发效率。
2024-03-25 20:17:19 518
原创 详解Java枚举类型
引言:随着Java语言的不断发展,枚举类型(Enum)成为了Java编程中不可或缺的一部分。本文将深入探讨枚举类型的背景意义、使用方法、常用方法以及优缺点,帮助读者更好地理解和应用枚举类型。
2024-03-24 15:03:41 952
原创 Java中的反射机制
反射是Java语言提供的一种能力,可以让程序在运行时检查和操作类、接口、方法以及类中的成员等。反射机制为开发者提供了动态操作类的能力,使得程序更加灵活、具有更高的可扩展性。在运行时获取类的信息,如类名、属性、方法等。动态创建对象实例。调用对象的方法和操作成员变量。实现通用的代码设计,如框架、插件等。
2024-03-24 09:15:00 1322
原创 Java中的Timer类以及自己实现一个MyTimer
Timer类是 Java 提供的用于执行定时任务的工具类。它允许你安排任务在未来的某个时间点执行,也可以定期执行。下面是关于Timer。
2024-03-23 12:42:19 377
原创 Java字符串常量池
引言:在Java编程中,字符串常量池一直是一个备受关注的话题。本文将从创建对象的思考、字符串常量池、再谈String对象创建等方面深入探讨Java字符串常量池。
2024-03-23 10:58:01 835 1
原创 深度优先搜索(DFS)与广度优先搜索(BFS)在 Java 中的应用
在算法和数据结构中,深度优先搜索(Depth First Search,DFS)和广度优先搜索(Breadth First Search,BFS)是两种常用的图遍历算法。广度优先搜索是一种利用队列实现的图遍历算法,其基本思想是从起始节点开始,先访问其所有相邻节点,然后再依次访问这些相邻节点的相邻节点,以此类推,直到所有可达节点都被访问过。深度优先搜索是一种递归的图遍历算法,其基本思想是从起始节点开始,沿着一条路径一直往下走,直到走到尽头,然后返回上一个节点继续探索其他路径,直到所有的节点都被访问过为止。
2024-03-20 17:05:18 538
原创 Java集合框架中的Map和Set
我们将详细介绍它们的概念、使用方法以及常用的方法,最后还会提供一些相关的练习题目。每个键都必须是唯一的,但值可以重复。Java提供了多种实现Map接口的类,其中最常用的是HashMap、TreeMap和LinkedHashMap。它提供了一种存储不同元素的方法,确保集合中的每个元素都是唯一的。3、使用TreeMap实现一个简单的字典,其中键为单词,值为单词的解释,然后按照单词的字典顺序输出所有单词及其解释。1、创建一个HashMap实例,添加若干个学生的姓名和对应的分数,然后遍历输出所有学生的姓名和分数。
2024-03-17 13:01:12 997
原创 深入了解 AVL 树
引言:AVL 树是一种自平衡二叉搜索树,它能够保持树的平衡性,从而提高了搜索、插入和删除操作的效率。在本文中,我们将深入探讨 AVL 树的概念、使用场景,并通过 Java 实现一个简单的 AVL 树。
2024-03-11 11:31:24 391
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人