- 博客(5045)
- 资源 (11)
- 收藏
- 关注
原创 【Linux】Linux 查看启动超过五分钟的任务,然后杀死
2.遍历临时文件中的进程信息,提取每个进程的PID和启动时间,然后计算它们与当前时间的时间差。我想在linux上执行查看以abc开头的任务,然后判断这个任务启动时间到现在是否超过5分钟,然后批量杀死超过5分钟的进程。我想在linux上执行查看以abc开头的任务,然后判断这个任务启动时间到现在是否超过5分钟,然后批量杀死超过5分钟的进程。我想在linux上查看执行的所有任务,然后判断这个任务启动时间到现在是否超过5分钟,获取这些任务的pid,一行命令表示。该命令将返回一个进程在秒数上的已经运行的时间。
2024-11-04 00:30:00 11
原创 【Spring】Spring为什么要事务传播?Spring 事务传播行为的本质是什么?
我们以前学习Spring 知道Spring有好几种事务传播行为,但是却从来没有思考过Spring为什么要事务传播?Spring 事务传播行为的本质是什么?所以我们司机硬背,然后因为开发中又不经常使用,然后还经常忘记,所以这里了解了本质,那么就更容易记忆,或者仅仅靠着自己的知识就能推导出来。所谓的事务传播行为就是说多个声明事务的方法,相互调用的时候,这个事务应该如何传递?你先自己想一下。
2024-11-04 00:15:00 207
原创 【java】hashMap为什么不使用线性探测法?
线性探测法在处理冲突时需要逐个尝试下一个位置,直到找到一个空槽或者遍历完整个哈希表。这种逐步探测的方式可能导致性能下降,特别是当哈希表的负载因子较高时,冲突的概率增加,探测的开销也会增加,导致平均查找时间的增加。线性探测法容易产生聚集效应,即相同哈希值的元素在哈希表中聚集在一起。当出现大量冲突时,这些聚集的元素会形成一个线性的连续区域,这会导致哈希表的性能下降,因为查找时需要逐个探测这些相邻的元素。线性探测法在删除元素时存在问题。当要删除一个元素时,需要保持哈希表的连续性,即不能留下空洞(未被使用的槽位)
2024-11-03 00:30:00 118
原创 【java】volatile用多了会导致什么问题,怎么解决?
综上所述,当过度使用 volatile 关键字时,可能会导致内存开销、可见性问题和死循环等问题。要解决这些问题,可以使用更轻量级的同步机制、锁或者重新评估需求,选择更合适的解决方案。通过以上步骤,可以帮助你排查过度使用 volatile 导致的问题。重点在于审查代码、分析并发操作、检查可见性问题、使用调试工具和进行综合性的测试。怎么排查这样的问题?
2024-11-03 00:15:00 11
原创 【java】分布式锁实现方式以及选型的分析
本章节主要讲解分布式锁的实现需要考虑哪些因素?锁必须是互斥的锁必须是可重入的锁必须是安全的锁最重要的就是要必须是互斥的,如果不是互斥的,那么将没有意义。那我们接着来思考一下,如果让我们去实现一个分布式锁,我们应该要满足那些条件呢?我们这个分布式锁可能会有很多的服务器来获取,所以我们一定要能够高性能的获取和释放;不能因为某一个分布式锁获取的服务不可用,导致所有服务都拿不到或释放锁,所以要满足高可用要求;
2024-11-03 00:15:00 10
原创 【Spring】Spring的ApplicationEnvironmentPreparedEvent事件、环境准备事件
请注意,ApplicationEnvironmentPreparedEvent 在应用程序的早期阶段触发,此时应用程序的上下文尚未完全加载,因此在这个事件中进行的操作可能是有限的。如果需要在更晚的阶段执行操作,可以考虑使用其他的 Spring 事件,如 ApplicationStartedEvent 或 ApplicationReadyEvent。上述示例中,当应用程序的环境准备阶段触发 ApplicationEnvironmentPreparedEvent 事件时,监听器中的代码将被执行。
2024-11-02 00:15:00 10
原创 【Spring】Spring 什么时候打印的 The following profiles are active
然后那一会经常遇到获取到的active profiles是空的,如下图,然后就想知道 active profiles是什么时候初始化的,什么时候打印的。在这个文章中,我们知道是ApplicationEnvironmentPreparedEvent事件触发这个文件加载的。然后打印的位置是在SpringApplication的run方法里面的prepareContext中打印的。我们知道是什么时候加载的。
2024-11-01 00:30:00 18
原创 【Spring】Spring的Bean是线程安全的吗?创建Bean过程是线程安全的吗?
Spring的Bean的线程安全性取决于如何配置和使用它们。默认情况下,Spring的Bean是单例的,这意味着Spring容器会为每个Bean定义创建一个实例,并在整个应用程序中重用该实例。这种情况下,如果一个Bean类没有被设计成线程安全的,那么它可能不是线程安全的。如果在多线程环境中使用Spring的单例Bean,并且Bean类本身没有实现线程安全的机制(例如使用同步或锁),那么可能会导致并发问题。多个线程同时访问和修改同一个Bean实例的成员变量可能会导致数据竞争和不正确的结果。总而言之,
2024-11-01 00:15:00 15
原创 【java】偏向锁是加在对象头?是谁的对象头,锁的对象头 还是 竞争锁的对象头
当一个对象被线程获取到锁后,JVM会在对象头中的一部分空间存储线程ID,表示该对象处于偏向锁状态。此时,其他线程在获取该对象的锁时,不需要进行任何的同步操作,而是直接检查对象头中的线程ID是否与当前线程ID相同,如果相同,就表示该线程已经获取到了对象的锁,可以直接执行相关代码,避免了互斥同步的开销。,用于标记某个线程获取到了对象的锁,并且用于提供快速路径的访问。当其他线程尝试获取该对象的锁时,会触发偏向锁的撤销,重新回到无锁或者轻量级锁的状态,进而再进行竞争。,但是从来没考虑加在的是哪个对象的头上?
2024-10-31 18:33:44 102
原创 【Spring】Spring是如何帮助我们在并发下避免获取不完整的Bean?
假设有2个线程,第一个线程刚刚来的时候,然后从1级缓存中获取Bean没有获取到,然后从二级也没有,然后三级也没有,此时他自己创建,然后放到三级缓存,正打算做属性赋值的时候,线程2来了,然后在三级缓存中获取了实例,然后属性还没赋值就拿去用了,这样就会报错。假设我们线程A来创建BeanA,线程B来创建BeanB,线程C来创建BeanD,而且一级缓存中已经有了BeanC,此时线程A先来的,就会锁住一直到线程A创建BeanA完成,但是同时线程B来创建BeanB,线程C来创建BeanD都是阻塞的了。
2024-10-31 00:30:00 14
原创 【Spring】Spring 实例化前后干预接口 InstantiationAwareBeanPostProcessor
InstantiationAwareBeanPostProcessor接口是Spring框架中的一个扩展接口,用于在Bean实例化过程中进行自定义处理。该接口定义了多个回调方法,可以在Bean实例化的不同阶段进行干预和定制。它的主要作用是在Bean实例化过程中提供额外的扩展点,允许开发者在Bean实例化前后执行特定的逻辑。
2024-10-31 00:15:00 15
原创 【Spring】Spring的Controller为什么会被CGLB代理
启用了AOP功能:如果在应用程序中使用了Spring的AOP功能,并且配置了基于接口的JDK动态代理来管理代理对象,则所有的代理(包括控制器)都将使用JDK动态代理而不是CGLIB代理。因此,如果您的Controller类没有实现任何接口,并且您使用了Spring的默认配置,则应该会使用CGLIB代理。Spring框架在创建控制器类的代理时,会选择代理方式,其中包括使用CGLIB代理或者基于接口的JDK动态代理。今天调试Spring项目,发现公司的项目,Spring的Controller会被CGLB代理。
2024-10-30 00:30:00 316 1
原创 【Spring】Spring boot 读取配置文件的原理是什么?
我们知道了我们是发布了ApplicationEnvironmentPreparedEvent事件,那么需要知道哪些监听器监听了这个事件,调试发现有如下监听器。Spring boot在启动的时候会发布一个事件,然后由相关的事件监听器,监听这个事件,然后去解析文件。发布的事件是ApplicationEnvironmentPreparedEvent事件。然后会调用所有的SpringApplicationRunListener发布事件。上面发布了事件,然后事件的监听使用在。方法,然后在这个方法里面调用。
2024-10-30 00:15:00 404
原创 【Spring】Spring 外置 tomcat 启动原理
在createRootApplicationContext方法里面就会调用configura方法。这里正常内置tomcat启动的时候,就会调用SpringBootServletInitializer的onStartup方法。我们知道了Spring启动内置tomcat原理,在这个文章中,我们来看看Spring 外置 tomcat 启动原理。这个类启动的时候会把感兴趣的类WebApplicationInitializer的实现类传入onStartup方法。我们重写的如下,然后上面再调用就是调用我们重写的方法。
2024-10-29 00:15:00 12
原创 【Spring】SpringBoot内置Tomcat启动原理
因此,EmbeddedTomcat 配置类在满足条件的情况下,会自动配置一个嵌入式的 Tomcat 服务器,用于处理 Servlet 相关的请求和协议升级。然后就创建了TomcatServletWebServerFactory这个bean,然后返回给我们了,然后就调用了getWebServer方法,然后就与我们上面的图对应了。在getWebServer方法里面就有创建tomcat的逻辑,并且启动tomcat。一般我们的项目是不引入其他类的,比如jetty,然后这些就会飘红,然后就不会走jetty.
2024-10-28 00:30:00 199
原创 【java】java Thread Stop方法会释放锁吗?
该方法本质上是不安全的。使用Thread.stop停止一个线程会导致它解锁所有已锁定的监视器(这是因为未经检查的ThreadDeath异常在堆栈中传播的自然结果)。如果这些监视器之前保护的任何对象处于不一致状态,损坏的对象将对其他线程可见,可能导致任意行为。如果目标线程等待长时间(例如,在条件变量上等待),应使用interrupt方法中断等待。以前我一直知道,java Thread Stop是被废弃的方法,只知道有问题,是直接关闭线程,会影响业务,但是究竟为什么废弃,却没有深入思考过。我们看下面这个案例。
2024-10-27 00:30:00 19
原创 【java】 Java 中的 7 种重试机制
从手动重试,到使用 Spring AOP 自己动手实现,再到站在巨人肩上使用特别优秀的开源实现 Spring Retry 和 Google guava-retrying,经过对各种重试实现方式的介绍,可以看到以上几种方式基本上已经满足大部分场景的需要:如果是基于 Spring 的项目,使用 Spring Retry 的注解方式已经可以解决大部分问题如果项目没有使用 Spring 相关框架,则适合使用 Google guava-retrying:自成体系,使用起来更加灵活强大。
2024-10-27 00:15:00 19
转载 【java】阿里:每天100w次登陆请求, 8G 内存该如何设置JVM参数?
一般来说,大企业或者架构师团队,都会为项目的业务系统定制一份较为通用的JVM参数模板,但是许多小企业和团队可能就疏于这一块的设计,如果老板某一天突然让你负责定制一个新系统的JVM参数,你上网去搜大量的JVM调优文章或博客,结果发现都是零零散散的、不成体系的JVM参数讲解,根本下不了手,这个时候你就需要一份较为通用的JVM参数模板了,不能保证性能最佳,但是至少能让JVM这一层是稳定可控的,相反,如果堆内存小,gc一次时间短,排队等待的线程等待时间变短,延迟减少,但一次请求的数量变小(并不绝对符合)。
2024-10-25 00:45:00 814
原创 【Java】java Thread 源码
然后猛然发现自己已经经常用的东西,源码都没看过。线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。
2024-10-25 00:30:00 126
原创 【java】 java HashMap的hash方法为什么要右移16位做异或?
在hashMap的put方法中是通过key的hash值和数组的长度取模计算得到的这样一个数组的位置,而在绝大部分情况下,N的值一般小于2的16次方,也是就是25536,所以也就意味着i的值始终是使用hash值的低16位与(n-1)进行取模运算,这是由与运算符的一个特征决定的,这样的话就会造成散列度不高,导致大量的key集中存储在一个固定的几个数组位置上,很显然会影响数组的查询性能。这样做的好处是,即使原始哈希码的分布不均匀,通过混合高位和低位的信息,可以增加最终的散列均匀性,减少哈希冲突的概率。
2024-10-25 00:15:00 20
原创 【java】java AQS唤醒节点时,为什么是从后往前找?
AQS实现中,等待队列的头部节点是持有锁资源或与锁相关的条件的节点,而后续节点是等待获取资源的节点。由于新加入的节点总是在链表的末尾,所以从后往前查找可以快速定位到最新的等待节点,避免了不必要的遍历。存储在双向链表中的任意一个位置的线程。都有可能出现线程中断导致这个线程从队列中移除,如果从前往后找,那么在并发场景下就可能出现一个空节点的问题,导致无法实现有效的线程唤醒,出现死锁的问题。这是因为在AQS中,等待队列是以双向链表的形式组织的,新加入等待队列的节点都是插入到链表的尾部。
2024-10-24 00:15:00 367
原创 【zookeeper】Zookeeper如何实现Leader选举?
它们的引入可以解决分布式系统中消息延迟和节点标识的问题,确保选举过程在相同的选举周期内,并选择具有最高zxid的节点作为Leader,从而保持数据的一致性和可用性。这样,一旦Leader选举完成,整个ZooKeeper集群就有了一个稳定的Leader,可以处理客户端的请求,并确保集群的一致性和可用性。需要注意的是,以上是Leader选举的简要介绍,实际的选举过程中还涉及到很多细节和优化,比如选举算法的变体、超时机制、选举的容忍度等。依据epoch、zxid和myid 这三个数据的原因是什么呢?
2024-10-24 00:15:00 31
原创 【MySQL】在SQL语句的分页查询中,limit 500000,10和limit 10速度一样快吗?
在SQL语句的分页查询中,limit 500000,10和limit 10速度一样快吗?在SQL语句的分页查询中,LIMIT 500000, 10 和 LIMIT 10 在速度上可能会有一些差异。当数据库引擎执行 LIMIT 500000, 10 时,它会首先跳过前面的500,000行数据,然后返回接下来的10行数据。相比之下,LIMIT 10 仅返回前10行数据,而不需要跳过任何数据,因此查询的速度可能更快。但是和两个元素有关数据量如果数据量很小的情况下,两者的差异很小。
2024-10-22 00:30:00 160
原创 【Spring】Spring @Contended注解有什么用?
在现代CPU中为了提高CPU的利用率,在CPU层面设计了L1/L2/L3三级缓存,缓存以缓存行为单位,进行数据的读取和写入。每个缓存行的大小通常是64个字节,由于多核处理器的多个核心 ,在并行执行任务的时候,允许同时读取同一个数据缓存到缓存行中,那么就存在一个潜在的问题。假设存在xy 2个变量,CPU1本来想读取x变量,但是因为缓存行的存在,他会读取到y变量,然后cpu2同理,一个cpu修改了数据并不会对另外一个cpu进行通知。
2024-10-19 00:30:00 28
原创 【MySQL】MySQL 什么是最左匹配原则?
要根据实际的查询需求和业务场景,考虑选择最常用的查询条件,将其作为索引的最左前缀列,以提高查询性能和索引的效用。所以如果只是单纯的使用b=2这个条件来查询,是没有办法用到索引的,因此在联合索引中只有先确认了前一个值,才能确定下一个值,如果有范围查询的话,联合家引中使用范围查询的字段后的家引任该条SQL中都不会起作用。当表中定义了一个由多列组成的复合索引,例如(col1, col2, col3),在查询时只能使用索引的最左前缀列或者最左前缀列的组合进行查询,才能充分利用索引的优势。
2024-10-19 00:15:00 136
原创 【java】select 和 epoll 的区别
但需要注意的是,对于简单的应用程序或连接数较少的场景,select仍然是一个有效的选择,并且具有更好的可移植性。select和epoll都是用于I/O多路复用的机制,用于管理并发的网络连接,它们可以让一个线程去监听多个文件描述符的IO事件或者连接事件,只要其中任何一个或者多个文件描述符就绪,就会触发阻塞唤醒,使得应用程序可以直接进行数据的读取或者写入。select是基干轮询的机和。一直到找到就绪的文件描达符,而epoll是基于事件通知机制,他只需要遍历当前就绪的文件描述符集合,大大减少了遍历的次数和开销。
2024-10-13 02:00:00 44
原创 【java】什么是可重入锁,为什么要可重入?
同时,可重入锁的性能相对于内置的synchronized关键字较好,但使用时需要手动进行锁的获取和释放,因此需要更加仔细地管理锁的使用。在运行的某个函数和代码,因为抢占资源或者中断导致这个资源或者代码,运行过程中被中断了,那么等到中断的程序执行完成以后,重新进入到这个函数的代码中,再次运行的时候,并且运行的结果不会发生改变,那么这个函数或者代码就是可重入的。所谓可重入锁就是一个线程抢占了互斥锁的资源,在锁释放之前再去竞争同一把锁的情况,不需要等待,只需要去记录重试次数。今天遇到一个锁的问题,
2024-10-13 02:00:00 42
原创 【java】JDK动态代理为什么只能代理有接口的类?
而且在java中类的技能关系的设计 更多的是考虑共性能力的抽象,从而去提高代码的重用性和扩展性,而动态代理就是在做这样一件事情,它封装了动态代理的生成抽象逻辑,以及判断一个类是不是动态代理,以及其他相关的逻辑,那么我们把这些抽象的公共逻辑放到一个父类里面,也是一个正常的思路。在java中动态代理是通过调用Proxy.newProxyInstance()来实现的,但是却需要传入被动态代理的一个接口类,之所以要传入接口而不能传入类,还是取决于JDK动态代理的一个底层实现。
2024-10-12 09:05:53 262
原创 【java】java中DCL单例模式设计为什么需要volatile修饰实例对象
由于这三个指令并不是原子性的,按照重排序的第一个规则: 在不影响单线程执行结果的情况下,两个不存在依赖关系的指令是允许重排序的,也就是说不一定按照我们代码写的顺序来执行 ,这样就可能导致其他线程获取到一个不完整的对象。总结而言,将单例对象声明为volatile,可以解决DCL中的潜在线程安全问题,确保在多线程环境中正确且安全地获取到完全初始化的单例实例。在多线程环境中,由于指令重排序的优化,可能会导致某个线程在访问未完全初始化的单例对象时获取到一个不完整的实例。需要将单例对象声明为volatile的。
2024-10-12 09:05:45 41
原创 【java】wait和sleep是否会触发锁的释放以及CPU资源的释放?
1.wait()方法:在Java中,wait()方法是Object类中的一个方法,用于线程间的同步和通信。当一个线程调用对象的wait()方法时,它会释放该对象的锁,并进入等待状态,直到其他线程调用相同对象的notify()或notifyAll()方法来通知等待的线程。。当等待的线程被通知后,它必须重新竞争锁才能继续执行。2.sleep()方法:在Java中,sleep()方法是Thread类提供的一个静态方法,用于使当前线程暂停执行一段指定的时间。。sleep()方法并不涉及锁的释放。
2024-10-07 12:07:16 72
原创 【java】java Blocked和Waiting有什么区别
它可以是一个主动等待的状态,即进程或线程自己决定等待,也可以是被动等待的状态,即受到其他进程或线程的通知后等待。在等待状态下,进程或线程不会消耗CPU资源。表示进程或线程由于某种原因而无法继续执行,它可能在等待某个事件发生或等待某个资源变得可用。因此,"Blocked"通常用于描述进程或线程被动地等待某个事件或资源的情况,而"Waiting"通常用于描述进程或线程主动等待其他进程或线程的情况。"Blocked"和"Waiting"都是与进程或线程状态相关的术语,描述了它们在执行过程中的不同状态。
2024-10-07 12:06:55 136
原创 【linux】linux unable to create new native thread
今天遇到一个问题但是看着代码这里应该不会报错,出现这个问题该怎么排查呢?当在Linux系统中出现 “unable to create new native thread” 错误时,通常是由于达到了系统可用的进程或线程数量限制导致的。这个错误表示系统无法创建新的本地线程。主要核心是2个原因:有程序创建了很多线程导致线程耗尽线程最大限制设置的太小为了排查和解决这个问题,您可以采取以下步骤:查看当前系统的进程和线程限制:使用命令 ulimit -a 可以查看当前系统的资源限制。
2024-09-30 15:52:55 182
原创 【Spring】Spring DeferredLogFactory 延迟创建日志记录器
在做里面的实验的时候遇到这个问题。在里面我们先解决了问题:然后发现日志也是一直没有。经过一番查询,如果发现程序中日志没有输出,检查是否使用了slf4j输出日志,此时因为日志系统未初始化无法输出日志。
2024-09-30 15:52:43 48
原创 【Spring】扩展点EnvironmentPostProcessor实例详解
之前项目中用到了Apollo配置中心,对接Apollo配置中心后,配置中心的属性就可以在程序中使用了,那么这个是怎么实现的呢?配置中心的属性又是何时加载到程序中的呢?那么我们如果找到了这个是怎么实现的是否就可以 从任何地方加载配置属性、配置属性的加解密功能呢?
2024-09-28 10:08:41 310
原创 【Spring】PropertySource named ‘application-dev.properties‘ does not exist
然后我们去看看相关的equals方法,MapPropertySource的equals方法和hash方法是在父类的PropertySource里面,方法内容如下。所以最终调用的是CopyOnWriteArrayList的indexOf方法去获取值,然后最终调用的是PropertySource的equals方法。MapPropertySource的equals方法和hash方法是在父类的PropertySource里面,方法内容如下。然后突然怀疑是不是我的Order设置的太高了,我的设置如下。
2024-09-28 10:08:23 144
原创 【Spring】SpringBoot手写模拟Spring boot
本章主要讲解SpringBoot手写模拟Spring boot,在此之前我们先了解一下怎么创建SpringMVC。
2024-09-27 08:59:41 159
原创 【Spring】Spring的AnnotationConfigApplicationContext类讲解、单测一个Service
Spring 启动流程来讲,之前所分析的都是基于类的实现进行的处理的,对于 Spring6.x 来讲最为核心的部分是通过注解的方式来进行配置。Spring 6.0.0 提了一个非常完美的概念,就是彻底废除掉 XML 的配置方式,后来发现完全去掉后,有些地方不好,所以后来的更新版本里面又逐步的恢复了原始的配置方式,如果考虑到后续因为要与 SpringBoot 进行对接环节,本次的内容还是要尽量以注解的方式进行。
2024-09-27 08:59:18 130
Eclipse Formatter 模板 Formatter.xml
2020-11-11
eclipse的hadoop插件
2016-09-14
hadoop学习文档
2016-09-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人