- 博客(95)
- 收藏
- 关注
原创 Selenium+OpenCV处理滑块验证问题
遍历所有轮廓,计算每个轮廓的面积和周长,筛选出符合特定条件的轮廓(即滑块的目标区域)。如果找到符合条件的轮廓,绘制矩形并保存图像,最后返回目标区域的横坐标 rect.x。Canny 算法能够有效地检测出图像中的边缘,便于后续的轮廓检测。这个文件主要包含了一个使用 OpenCV 进行图像处理的方法 getPos,用于检测滑块图像中目标区域的位置。使用高斯模糊对图像进行平滑处理,减少图像中的噪声,便于后续的边缘检测。调用 getPos 方法处理滑块验证码图片,获取目标区域的横坐标。将滑块验证码图片下载到本地。
2025-02-19 10:57:18
949
原创 JUC——变量的线程安全实例分析
不是HashMap不是线程安全的、Hashtable是线程安全的。是线程安全的,String是不可变类 String S1 = ">>>";不安全 被final修饰但是,final指的是引用值不可变,但是日期的其他的属性比如年月日都是可以变的 final Date D2 = new Date();没有线程安全问题在第二个类中,调用方法创建的一直都是新的变量。线程是不安全的,都是单例的需要被共享,它里面的成员变量也是需要被共享的。答:子类就可能破环方法的行为,将线程安全的方法变成不安全的了。
2025-02-19 10:27:17
240
原创 JUC——变量的线程安全分析
/线程1,线程2 if(table.get("key")==null){ table.put("key",value);方法的修饰符是有意义的,在一定程度上可以保护线程安全问题,如果使用private,就限制了子类不能覆盖这个方法。局部变量:在mothod中new出来的list对象,每个线程的栈中都会创建自己的,目前还没有暴露给外部。m3方法中创建出了t2线程,并将在t1线程中创建的局部变量和t2线程共享了。String、Integer等都是不可变类,因为其内部的状态是不可变的,因此方法都是线程安全的。
2025-02-19 10:25:14
357
原创 JUC——Synchronized原理
如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。锁竞争:如果多个线程轮流获取一个锁,但是每次获取锁的时候都很顺利,没有发生阻塞,那么就不存在锁竞争。如果在尝试加轻量级所的过程中,CAS操作无法成功,这时一种情况就是有其他线程为此对象加上了轻量级锁(有竞争),这时需要进行锁膨胀,将轻量级锁变为重量级锁。
2025-02-19 10:21:03
623
原创 JUC——Monitor的概念
每个Java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级)之后,synchronized 必须是进入同一个对象的monitor 才有上述的效果。该对象头的Mark Word中就被设置指向Monitor对象的指针地址。进入(BLOCKED)阻塞状态,但是唤醒的先后顺序由JDK底层决定。不加 synchronized的对象不会关联监视器,不遵从以上的规则。Monitor被翻译为 监视器 或 管程。
2025-02-19 10:15:48
138
原创 JUC——进程与线程
将CPU的时间片(Windows下时间片最小约为15毫秒)分给不同的线程使用,只是由于CPU在线程间(时间片很短)的切换非常快,人类感觉是同时运行的。多线程可以让方法执行变为异步的 比如说读取去磁盘文件时,假设读取花费了5秒种,如果没有线程调度机制,这5秒调用者什么都做不了,其代码都得暂停。多核CPU下,每个(core)都可以调度运行线程,这时候线程可以是。在windos中,进程仅仅最为线程的容器,进程是不活动的。线程作为最小的调度单位,进程作为资源分配的最小单位。单核CPU下,线程实际还是。
2025-02-19 10:06:50
863
原创 JVM——垃圾回收器
会导致STW,G1中可以通过参数-XX:MaxGCpauseMillis=n (默认是200)设置每次垃圾回收是的最大暂停时间毫秒数,G1垃圾回收器会尽可能地保证暂停的时间。吞吐量 = CPU在用户应用程序运行的时间 / (CPU在用户应用程序运行的时间 + CPU垃圾回收的时间)Parallel Scavenge是JDK8默认的年轻代垃圾回收器,多线程并行回收,关。由于垃圾回收器分为年轻代和老年代,除了G1之外的其他垃圾回收器必须成组合进行使用。新生代使用ParNew回收器,老年代使用串行回收器。
2025-02-13 22:59:29
964
原创 JVM——垃圾回收算法
随着对象在Eden去越来越多,如果Eden区满,新创建的对象已经无法放入,就会触发年轻代的GC,称为Minor GC或者Young GC。当老年代中空间不足,无法放入新的对象时,先尝试minor gc如果还是不足,就会触发Full GC,Full GC会对整个堆进行垃圾回收。从上图可以看到,Full GC 无法回收掉老年代的对象,那么当对象继续放入老年代时,就会抛出Out Of Memory异常。现代优秀的垃圾回收算法,会将上述描述的垃圾回收算法组合进行使用,其中应用最广泛的就是分代垃圾回收算法。
2025-02-13 22:58:37
1096
原创 JVM——堆的回收:引用计数发和可达性分析法、五种对象引用
软引用中的对象如果在内存不足时回收,SoftReference对象本身也需要被回收。,只要这层关系存在,普通对象就不会被回收,除了强引用外,java中还设计了几种其他引用方式。引用计数法会为每个对象维护一个引用计数器,当对象被引用时加1,取消引用时减1。如果一个对象只有软引用关联到它,当程序内存不足时,就会将软引用中的数据进行回收。弱引用包含的对象在垃圾回收时,不管内存够不够都会直接被回收。可达性算法中描述的对象引用,一般指的是强引用,即是。软引用相对强引用是一种比较软弱的引用关系,
2025-02-13 22:56:18
686
原创 JVM——类的生命周期
方法区中的instanceKlass使用c++编译的,java不太好操作,所以在堆中创建了堆区中通过java语言包装后的对象(再从方法区中拷贝的过程中会将一些内容剔除掉,只包含我们需要的。当我定义数据时使用了final关键字,这就代表了在以后这个数据的值不再会发生变化了,所以就会在准备阶段直接将代码中的值进行赋值。连接阶段的第一个环节是验证,验证的主要目的是检测Java字节码文件是否遵守了《Java虚拟机规范》中的约束。3、类加载器在加载完类之后,java虚拟机会将字节码中的信息保存到内存的方法区中。
2025-02-13 22:53:07
1092
原创 初识JVM——什么是JVM、JVM的功能——解释和运行、内存管理、即时编译
java需要实时的将字节码转换成机器码文件(随着程序的执行,需要反复地进行该操作,每次都会花费一定的时间),而c/c++在编译过程中直接可以将源代码文件转换成计算机任何的机器码 .c文件-->.exe文件。被解释并优化为机器码,然后这段机器码保存至内存中,当需要再次执行的时候 直接调用就可以了,这样一来就省略了一次解释的步骤,提高了性能。JVM时Java虚拟机,是一运行在计算机上的程序,他的职责是运行java字节码文件。运行Java的字节码文件解释成机器码文件。对字节码文件中的指令,
2025-02-13 22:49:46
197
原创 JDK实现动态代理介绍+案例
它允许在不修改目标对象代码的情况下,对目标对象的方法进行增强。这种机制主要基于接口,代理对象会实现与目标对象相同的接口,从而可以在调用目标对象方法前后添加额外的逻辑。:这是 JDK 动态代理的核心类,提供了创建代理对象的静态方法。,用于定义代理对象方法被调用时的具体逻辑。JDK 动态代理是 Java 提供的一种。:这是一个接口,其中只有一个方法。在运行时创建代理对象的机制。
2025-02-08 20:13:42
375
原创 Cglib实现动态代理介绍+案例
在 Java 中,CGLIB(Code Generation Library)是一个强大的、高性能的代码生成库,它可以在运行时扩展 Java 类与实现 Java 接口,常用于实现动态代理。与 Java 自带的动态代理不同,CGLIB可以为没有实现接口的类创建代理,它通过生成目标类的子类来实现代理功能。CGLIB 可以为没有实现任何接口的普通类创建代理,它通过生成目标类的子类来实现代理功能。这使得 CGLIB 的使用场景更加广泛,特别是在处理一些遗留代码或者第三方库中的类。
2025-02-07 21:23:20
322
1
原创 0207算法:寻找目标值、库存管理
现因突发情况需要进行商品紧急调拨,管理员将这批商品。提前依次整理至库存表最后。请你找到并返回库存表中编号的。力扣LCR121:寻找目标值。LCR 128 库存管理。形式记录商品库存表。以便及时记录本次调拨。
2025-02-07 20:53:53
236
原创 0205算法:最长连续序列、三数之和、排序链表
找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。答案中不可以包含重复的三元组。请你设计并实现时间复杂度为。给定一个未排序的整数数组。,判断是否存在三元组。
2025-02-05 21:32:30
412
原创 云服务器部署springboot项目、云服务器配置JDK、Tomcat
(这个server.xml里面有tomcat的配置 可以在这里修改,这里可以把tomcat端口改成80,就这里 tomcat默认端口8080 改成80 和http默认端口一样 访问就不用输入端口号了。由于我的项目是springboot项目,内嵌了Tomcat,所以不需要使用服务器安装的Tomcat。执行以下命令,将解压后的文件夹下的文件移动到 /usr/local/tomcat/ 目录下。JDK版本:jdk-8u431-linux-x64.tar。然后使用浏览器访问就行:你的项目路径就可以了。
2024-11-22 22:00:40
693
原创 WebSocket详解、WebSocket入门案例
WebSocket 是一种网络通信协议。WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通信的协议。HTTP 协议是一种无状态、无连接、单向的应用层协议。它采用了 请求/响应 模型。通信请求只能由客户端发起,服务端对请求做出应答处理。(单向的:采用的是请求+响应的模式)这种通信模型有一个弊端:HTTP协议无法实现服务器主动向客户端发起消息。这种单项请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数Web应用程序将通过频繁的异步ajax请求实现长轮询。
2024-11-20 18:21:16
1475
原创 POI和easyExcel的讲解和使用
EasyExcel能大大减少内存占用的主要原因是在解析Excel时没有将文件数据一次性全部加载到内存中,而是从磁盘上一行一行读取数据,逐个解析。我们如果使用easyExcel的话,就不再需要去单独导入POI的依赖了,点进easyExcel的依赖 那里就包含了POI的依赖了。优点:可以写非常大的数据量,如100万条甚至更多条,写数据速度快,占用更少的内存。开发中经常会涉及到excel的处理,如导出Excel,导入Excel到数据库中。缺点:写数据时速度非常慢,非常耗内存,也会发生内存泄露,如100万条。
2024-11-16 10:25:24
1470
原创 拦截器详解
在HandlerMethod类中,getMethod()方法是用来获取与当前请求处理方法相对应的java.lang.reflect.Method对象。原始程序执行过程中出现的异常,简单来说就是,我在controller的方法中抛出了异常,我在这里是可以拿到的。过滤器是在tomcat服务器阶段进行配置的,他能够对所所有访问进行增强,拦截器配置的只可以对SpringMvc的访问做增强。封装了springmvc页面跳转的相关数据,但是基本不用,现在都基本返回json。【拦截器都是给controller层用的】
2024-11-16 10:05:34
1017
原创 JWT介绍、测试案例 以及实际开发中的使用
JWT,通过数字签名的方式,以json对象为载体,在不同的服务终端之间安全的传输信息,用来解决传统session的弊端。JWT在前后端分离系统,通过JSON形式作为WEB应用中的令牌(token),用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中,还可以完成数据加密、签名等相关处理。
2024-11-16 09:43:37
1539
原创 Javamail发送Excel附件具体实现
在我写大学生高考志愿填报的时候,将推荐出来的专业表的信息发送到指定的账户的邮件中。首先创建配置文件,配置邮箱账户的信息配置用于生成表格的实体类,实体类中的信息就对应着Excel表中的信息逻辑的具体实现:首先从Cookie中获取账户的邮箱信息,(我在cookie中只存了账户的邮箱号,没有帐户其他的信息)。获取我查询结果的datas将datas封装成Excel表格发送带有Excel表格的邮件将本地的Excel表格删除掉
2024-11-16 09:33:13
665
1
原创 JVM双亲委派机制详解
类加载器中的父子关系可以通过classloader -t 查看:(在图片中将扩展类加载器和启动类加载器在同一级 也正是因为扩展类加载器的parent为null)进行代码的验证如下:输出string类的时候为null,正是因为在java代码中是不可以获取到类加载器的信息的。由于Java虚拟机中有多个类加载器,双亲委派机制的核心是解决一个类到底由谁加载的问题。答:启动类加载器加载,根据双亲委派机制,他的优先级是最高的。双亲委派机制指的是:当一个类加载器接收到加载类的任务时,会。向下委派加载起到了一个。
2024-11-12 21:36:56
890
原创 JVM——类加载器、类加载器的分类
类加载器是java虚拟机提供给应用程序去的技术。类加载器的分类:一类是 Java代码中实现的一类是 Java虚拟机底层源代码实现的通常可以细分为三大类:jdk8版本中的java代码中的扩展类加载器:Extension 允许扩展Java中比较通常的类 (比较通用但是不特别重要)应用程序类加载器Application 加载应用所使用的类,还有一些第三方中jar包中的类java虚拟机中的启动类加载器Bootstrap:加载java中最核心的类 比如String类
2024-11-12 21:24:43
660
原创 JVM的组成、字节码文件的组成
1、如何查看字节码文件?如果是本地的文件,可以直接使用jclasslib开打进行查看,开发环境的话 可以使用jclasslib插件如果是在服务器上文件使用javap命令直接查看,也可以通过arthas的dump命令导出字节码文件再查看本地的文件。还可以使用jad命令反编译出源代码。2、字节码文件的核心组成有哪些?基本信息:魔数、字节码文件对应的java版本号访问标识(public final等等)常量池:保存了字符串常量、类或者接口名、字段名主要在字节码指令中使用。
2024-11-11 23:07:36
1224
原创 初识JVM、解释和运行、内存管理、即时编译
JVM全称是Java Virtual Machine,中文译名为Java虚拟机。JVM本质上是一个运行在计算机上的程序,他的职责是运行Java的字节码文件解释成机器码文件。.java文件通过javac编译成.class文件【也就是字节码文件】,然后通过java虚拟机解释成机器码。注:javac 是java中的编译源代码的命令工具,将.java文件编译成 .class 文件。JVM时Java虚拟机,是一运行在计算机上的程序,他的职责是运行java字节码文件。
2024-11-11 22:59:41
684
原创 synchronized的详解、锁的升级过程和优缺点比较
本文 详细介绍Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗而引入的和,以及锁升级过程。Java中每一个对象都可以作为锁。Java中每一个对象都可以作为锁。具体表现形式为以下三种形式:对于普通的同步方法,锁是当前的实例对象对于静态同步方法,锁是当前类的Class对象对于同步方法块,锁是Synchronized括号里面的配置对象
2024-09-15 21:01:15
1126
1
原创 AOP的入门案例、工作流程以及核心概念
目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的代理(Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现上面这两个概念比较抽象,简单来说,目标对象就是要增强的类[如:BookServiceImpl类]对应的对象,也叫原始对象,不能说它不能运行,只能说它在运行的过程中对于要增强的内容是缺失的。SpringAOP是在不改变原有设计(代码)的前提下对其进行增强的,它的底层采用的是代理模式实现的
2024-09-15 09:32:19
1051
原创 Spring:DI的详解☞setter注入、构造器注入
向一个类中传递数据的方式有几种?普通方法(set方法)构造方法依赖注入描述了在容器中建立bean与bean之间的依赖关系的过程,如果bean运行需要的是数字或字符串呢?引用类型简单类型(基本数据类型与String)Spring就是基于上面这些知识点,为我们提供了两种注入方式,分别是:setter注入简单类型==引用类型==构造器注入简单类型引用类型。
2024-08-18 23:59:22
1003
原创 Spring:IOC的详解☞Bean的实例化、Bean的生命周期
修改BookServiceImpl类,添加两个接口InitializingBean, DisposableBean并实现接口中的两个方法afterPropertiesSet和destroy。需要注意的一点是,构造方法在类中默认会提供,但是如果重写了构造方法,默认的就会消失,在使用的过程中需要注意,如果需要重写构造方法,最好把默认的构造方法也重写下。现在我们面临的问题是如何在bean的创建之后和销毁之前把我们需要添加的内容添加进去。——单例模式下多次从容器中获取bean的地址是是一样的。
2024-08-17 23:26:03
957
原创 Spring:IOC和DI的入门案例
需求:基于IOC入门案例,在BookServiceImpl类中删除new对象的方式,使用Spring的DI完成Dao层的注入。的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前面加set找对应的。在BookServiceImpl类中,删除业务层中使用new的方式创建的dao对象。使用Spring提供的接口完成IOC容器的创建,创建App类,编写main方法。对象的new操作,它们之间的耦合度还是比较高,这块该如何解决,就需要用到下面的。5.使用Spring提供的接口完成IOC容器的创建。
2024-08-17 21:54:00
1378
原创 Redis数据结构:String、List、Set的详解
String是Redis中最常见的数据存储类型:其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是一段连续空间。申请内存时只需要调用一次内存分配函数,效率更高。
2024-08-16 23:59:24
1109
原创 Redis数据结构:QuickList、
问题1:ZipList虽然节省内存,但申请内存必须是连续空间,如果内存占用较多,申请内存效率很低。怎么办?答:为了缓解这个问题,我们必须限制ZipList的长度和entry大小。问题2:但是我们要存储大量数据,超出了ZipList最佳的上限该怎么办?答:我们可以创建多个ZipList来分片存储数据。问题3:数据拆分后比较分散,不方便管理和查找,这多个ZipList如何建立联系?
2024-08-16 23:56:49
1147
原创 Redis数据结构ZipList详解、ZipList的连锁更新问题
压缩列表的可以看做一种连续内存空间的"双向链表"列表的节点之间不是通过指针连接,而是记录上一节点和本节点长度来寻址,内存占用较低如果列表数据过多,导致链表过长,可能影响查询性能增或删较大数据时有可能发生连续更新问题。
2024-08-15 22:26:33
1226
原创 Redis数据结构:动态字符串SDS、Intset、Dict详解
Dict的结构:类似java的HashTable,底层是数组加链表来解决哈希冲突Dict包含两个哈希表,ht[0]平常用,ht[1]用来rehashDict的伸缩:当LoadFactor大于5或者LoadFactor大于1并且没有子进程任务时,Dict扩容当LoadFactor小于0.1时,Dict收缩扩容大小为第一个大于等于used + 1的2^n收缩大小为第一个大于等于used 的2^nDict采用渐进式rehash,每次访问Dict时执行一次rehash。
2024-08-15 21:52:23
1135
原创 踩坑【已解决】:Redis配置主从复制踩到的坑,主机不显示从机的连接信息,但是从机显示主机信息
在master的配置文件中我们配置了密码的信息,但是我们在从配置文件中没有添加相应的连接配置。
2024-08-13 16:32:25
296
原创 Redis哨兵机制详解
Sentinel的三个作用是什么?监控故障转移通知Sentinel如何判断一个redis实例是否健康?每隔一秒发送一次ping命令,如果超过一定时间没有响应则认为是主观下线如果大多数的sentinel都认为实例主观下线,则判断该服务客观下线。故障转移的步骤有哪些?首先选定一个slave作为新的master,执行slaveof no one然后然所有的二节点都执行slaveof 新master修改故障节点配置,添加slaveof 新master。
2024-08-13 14:36:16
801
原创 Redis主从集群的搭建教程
我们搭建的主从集群结构如图:共包含三个节点,一个主节点,两个从节点。准备实例和配置要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。1)创建目录我们创建三个文件夹,名字分别叫7001、7002、7003:这三个文件夹需要在redis文件同级目录下#创建目录mkdir 7001 7002 7003
2024-08-13 13:40:17
629
原创 Redis主从数据同步原理的详解、以及优化方案
简述全量同步和增量同步区别?全量同步:master将完整的内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog逐个发送给slave增量同步:slave提交自己的offest到master,master获取repl_baklog中从offest之后的命令给slave什么时候执行全量同步?slave节点第一次连接master节点时slave节点断开时间太久,repl_baklog中的offset已经被覆盖时什么时候执行增量同步?
2024-08-12 23:03:10
1588
原创 Redis持久化——AOF详解、RDB和AOF的区别
appendOnlyFile(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。AOF默认是关闭的,需要修改redis.conf配置文件来开启AOF:# 是否开启AOF功能,默认是no appendonly yes # AOF文件的名称 appendfilename "appendonly.aof"AOF的命令记录的频率也可以通过redis.conf文件来配:# 表示每执行一次写命令,立即记录到AOF文件 appendfsync always # 写命令执行完
2024-08-12 14:18:42
416
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人