- 博客(43)
- 资源 (2)
- 收藏
- 关注
原创 word转pdf 好用的工具包com.aspose.words
综上所述,com.aspose.words 是一个功能强大的文档处理库包名,它提供了丰富的API和高效的性能,支持跨平台和多种编程语言,广泛应用于企业级应用、Web应用和移动应用等领域。格式转换:Aspose.Words 支持将Word文档转换为其他格式,如PDF、HTML、ePub等,同时也支持从其他格式(如PDF、HTML)转换为Word文档。移动应用:在移动应用中,Aspose.Words 可以用于处理设备上的Word文档,提供文档查看、编辑和转换等功能。
2024-10-10 18:32:28 506
原创 $accumulator(聚合)
accumulator 是 MongoDB 聚合管道中用于自定义数据处理逻辑的一个算子,它允许用户使用 JavaScript 编写代码来控制数据的初始化、累积、合并和最终输出。下面是对。
2024-07-15 11:03:08 852
原创 tomcat 的启动流程
tomcat 的启动流程 中 使用的Lifecycle 生命流程。在这里还使用了设计模式中的模板模式(LifecycleBase 是一个模板类)
2024-05-13 14:27:17 246 1
原创 Store buffer 解决CPU的停滞(stall)状态
此外,由于store buffer的存在,写操作的顺序也可能被打乱。例如,CPU1可能先执行了一个写操作A,然后执行了一个写操作B,但是由于写操作B的数据先被放入store buffer并随后被刷新到主存,而写操作A的数据还在store buffer中等待,所以其他处理器看到的写操作顺序可能是B-A,而不是A-B。在多线程环境下,当一个线程将一个变量的值写入Store buffer后,其他线程可能立即读取这个变量的值,但由于Store buffer的异步性,这个读取操作可能会得到旧的值,而不是新写入的值。
2024-05-08 16:24:18 817
原创 VM中常见的几种垃圾回收算法
*标记(Mark)**阶段:从根对象(通常是静态变量和正在执行的方法中的局部变量)开始,递归地访问所有可达的对象,并标记它们为“存活”。整理的好处可以将不同页中的数据,整理到一起,这样当内存访问的时候加载一页数据,说不定需要的数据都在这一页中,减少了页加载。**清除(Sweep)**阶段:遍历整个堆内存,回收未被标记的对象所占用的空间。这种算法简单且高效,但代价是内存的使用率降低了(因为只有一半的内存是可用的)。:移动所有存活的对象,使它们紧挨着彼此,然后直接清理掉边界以外的内存。
2024-04-23 14:39:33 242
原创 标记清除算法
标记清除算法(Mark-Sweep Algorithm)是一种最基本的垃圾回收算法,用于回收不再使用的内存空间。该算法的核心思想是通过标记所有仍然被使用的对象,然后清除所有未被标记的对象,从而回收内存。为了解决这些问题,实际应用中,标记清除算法通常会与其他垃圾回收算法结合使用,以达到更好的效果。例如,Java虚拟机中就采用了标记清除算法和标记整理算法相结合的方式,来进行垃圾回收。综上,标记清除算法通过标记和清除两个阶段来回收内存,具有简单易实现等优点,但也需要考虑其可能产生的内存碎片和性能影响。
2024-04-22 17:03:00 396
原创 jvm中提前进入老年代
在JVM中,对象的“年龄”通常指的是对象经过了多少次Minor GC(新生代垃圾回收)后仍然存活。每次Minor GC后,存活的对象会被移动到Survivor区,并且它们的年龄会增加。当对象的年龄达到某个阈值(这个阈值可以通过JVM参数 -XX:MaxTenuringThreshold 来设置,默认值是15)时,它们会被晋升到老年代(Old Generation)。
2024-04-18 17:24:27 1144
原创 关于项目中加入线程池,导致JVM性能急剧下降的问题
在项目中,为了提高新系统服务的并发处理能力,我在项目中加入了线程池。由于原来的项目是单线程的一个服务,或者说是一个少线程的服务.所以公司前辈,将jvm的TLAB 参数配置进行关闭了。TLAB(Thread Local Allocation Buffer)是在堆上开辟的内存空间。在Java虚拟机(JVM)中,堆是用于存储对象实例的主要内存区域。为了优化对象分配的性能,JVM引入了TLAB机制。当TLAB开启时,每个线程在堆上会有一个私有的内存区域用于对象分配。
2024-04-12 11:14:55 383
原创 java对象的内存布局
reference存储(引用)的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为) 时只会改变句柄池中的实例数据指针,而reference(引用)本身不需要改变。使用句柄访问对象,会在堆中开辟一块内存作为句柄池,句柄中储存了对象实例数据(属性值结构体) 的内存地址,访问类型数据的内存地址(类信息,方法类型信息),对象实例数据一般也在heap中开 辟,类型数据一般储存在方法区中。***类型指针:***指向对象类型元数据的指针,JVM通过这个指针来确定这个对象是哪个类的实例。
2024-04-10 16:18:31 305
原创 jvm中的数据区
**此外,栈中还有一个特殊的部分叫做本地方法栈,用于存放native方法,如hashCode()等,它也是线程私有的。这个引用指向方法区中的类元数据,使得对象能够知道它的类型,并能够访问该类型的字段和方法。因此,可以说堆中的对象在JVM中是依据方法区中的类的定义来创建的。这个过程是依据方法区中的类的定义来进行的,确保每个对象都是根据类的结构来正确创建的。如果在栈帧中有一个变量,类型为引用类型,比如Object obj=new Object(),这时候就是典型的栈中元 素指向堆中的对象。
2024-04-09 17:35:16 689
原创 加密class文件,使用自定义类加载器解密
接下来,你需要实现一个自定义的类加载器,这个类加载器需要能够读取加密的类字节码,解密它们,然后定义类。// 使用与加密时相同的密钥 public Class
2024-04-08 16:06:10 569
原创 CMS垃圾回收器 和G1垃圾回收器
初始标记(Initial Marking):此阶段会标记出GC Roots能直接关联到的对象,并且修改TAMS(Top At Mark Start)的值,让下一阶段用户线程并发运行时,能正确地在可用的Region中分配新对象。与其他垃圾回收器不同,CMS的主要目标是减少Stop-The-World(STW)的时间,即应用程序因垃圾回收而暂停执行的时间。重新标记(Remark):此阶段再次暂停所有的应用线程(STW),修正并发标记阶段因用户线程继续运行而导致标记产生变动的那部分对象的标记记录。
2024-03-27 14:07:45 758
原创 ScheduledFuture定时任务
这意味着你可以提交多个任务给 ScheduledExecutorService,它会利用线程池来高效地并发执行这些任务。灵活的任务调度:ScheduledExecutorService 提供了多种调度方法,允许你指定任务的初始延迟、执行间隔以及执行次数等。周期性执行任务:你可以安排一个任务按照固定的频率重复执行。定时执行任务:你可以安排一个任务在未来的某个时间点执行。任务取消和查询:通过返回的 ScheduledFuture 对象,你可以取消任务的执行,或者查询任务的状态(是否完成、是否取消等)。
2024-03-27 13:31:24 310
原创 WebSocket后端主动唤起前端
当前端new 一个WebSocket 对象时,会去调用其ws://localhost:8080/websocket 接口,这个会跟后天服务器建立一个类似于长连接的通讯链路,在后天向这个链路中发送消息是,前端可以通过onmessage 函数进行数据的处理,可以做一个后端返回给数据前端,前端及时弹窗的一个功能。// 创建XMLHttpRequest对象。// 连接打开时触发的事件处理函数。// 将响应数据显示在页面-->// 创建WebSocket连接。// 或者设置为允许的域名。// 判断请求是否完成。
2023-10-20 15:36:46 184
原创 AI 识别文字tesseract-ocr+jTessBoxEditorFX-2.4.1+OpenCV
jTessBoxEditor点击Box Editor ->Open,打开步骤2中生成的“zwp.test.exp0.tif”,会自动关联到“zwp.test.exp0.box”文件,这两文件要求在同一目录下。调整完点击“save”保存修改。在上一步骤生成的“xxx.font.exp0.tif”文件所在目录下打开命令行程序(即在cmd中切换盘符到文件目录下),执行下面命令,执行完之后会生成xxx.font.exp0.box文件。训练1 准备一个训练的基础的***.tiff***文件。
2023-10-11 15:47:47 426
原创 理解线程安全类和底层cas
需要注意的是,虽然 CAS 操作可以实现非阻塞的线程安全,但在高并发场景中,由于可能存在 ABA 问题(即变量的值在某一时刻恰好等于期望的值,但在期间发生了其他线程的干扰导致某些状态的改变),需要使用额外的手段进行解决,例如使用版本号或时间戳等方式来区别不同状态。需要注意的是,AQS 在实现具体的同步器时,保证了对状态变量的操作都是原子的,但具体的同步逻辑和操作需要由子类来实现,并且在使用 AQS 的抽象方法时,开发者需要注意正确处理状态变量的修改和状态转换,确保线程安全性,并避免数据竞争和并发问题。
2023-08-21 17:06:42 85
原创 Debezium
Debezium提供了一套可扩展的、虚拟化的、与数据库无关的架构,可适用于多种数据库引擎和数据存储系统。总的来说,Debezium的核心是基于数据库的binlog或其他事务日志,实时捕获数据变更,并将数据变更以事件的形式传输到消息队列中,以实现实时的数据变更监控和同步。支持数据变更的“源端”和“目标端”之间的数据同步,允许实时地将源数据库中的数据变更同步到目标数据库中,确保数据的一致性和实时性。基于捕获的数据变更,生成一系列的事件,这些事件描述了数据的变更细节,如变更前的数据、变更后的数据、操作类型等。
2023-07-13 15:46:51 209
原创 聚合索引,中存在的页分裂和页合并
索引节点如果按4k为一个节点存储数据,当索引数据节点中的4k全部被占满,但是现在要进行索引树(b+树)数据插入更新,并且插入的数据是中间数据时,此时中间数据的节点将会超过4k的大小,需要将这个4k数据索引树节点进行分裂,分裂成两个索引树节点。这种就叫做页分裂。页合并:是指索引树节点原先是4k和4k,后面删除部分索引树节点数据,变为2k和2k的数据,或者说数据量和小于4k时,为了节约空间,会合并成一个索引树节点,这个就叫页合并。
2023-02-27 22:42:32 338
原创 RequestInterceptor 自定义请求头内容(Feign)
SpringCloud的微服务使用Feign进行服务间调用的时候可以使用RequestInterceptor统一拦截请求来完成设置header等相关请求,但RequestInterceptor和ClientHttpRequestInterceptor有点不同,它拿不到原本的请求,所以要通过其他方法来获取原本的请求。这里通过RequestContextHolder获取到当前的request。首先创建自定义的RequestInterceptor。
2023-02-14 17:19:56 443
原创 定时任务在分布式集群中,确保任务执行一次
解释:为什么去保存任务的redis缓存一段时间,为防止任务被执行成功后,该缓存丢失后,其他实例执行该任务是,去缓存中没有查询到改任务数据,导致其他实例又执行一遍。3通过key,去redis中检索数据,未找到这个value值,则应该执行这个任务,执行成功后应当保存该任务key的redis缓存一段时间。覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务;利用redis,构建分布式锁(NX), 数据结构(key:由任务的唯一标识组成;
2023-02-02 09:20:10 1936
原创 赋值请求头的Host,赋值成功,但是Host无法被覆盖
但是为了容灾,客户端需要指定ip访问该服务,如果该ip坏掉,客户端就切换到另个一ip(靠dns解析太慢)于是在http请求上做了点处理,url配置ip,同时配置http头部的Host参数为该域名,通过ip访问,设置Host头部来让nginx识别,然后分发到相应的处理程序。赋值请求头的Host,赋值成功,但是Host无法被覆盖。对外提供http接口,采用nginx反代,使用域名访问。nginx上只配置了域名的分发,没有配置ip分发。如果想要覆盖需要设置。
2023-02-01 17:47:46 403
原创 rocketMQ下的Broker
元数据在broker节点启动时,会主动汇报集群的元数据,去支持p/c的路由信息,信息汇报给NameServer(可以多个)。NameServer数据不需要持久化,内存化就可以(因为每次broker会将信息向NameServer报告)。Broker包含一下几个重要的子模块。
2023-01-14 17:19:25 267
原创 spring cloud steam 整合kafka 进行消息发送与接收
Binder是SpringCloud Stream的一个抽象概念,是应用与消息中间件之间的粘合剂,目前SpringCloud Stream实现了Kafka和RabbitMQ的binder。Binder可以生成Binding,Binding用来绑定消息容器的生产者和消费者,它有两种类型,INPUT和OUTPUT,INPUT对应于消费者,OUTPUT对应于生产者。
2022-12-22 15:57:37 2238
原创 netty 编码器解码器
netty是区别于以往的传输方式,通过字节来传输。编码器和解码器主要用于解析,加密,可以按自己的逻辑去实现数据的传输格式,可以自定义协议。通过ChannelPipeline对象可以向链路中添加 解码器和编码器RequestDataEncoder 编码器(继承MessageToByteEncoder)ResponseDataDecoder 解码器 (继承ReplayingDecoder)
2022-12-07 13:44:29 373
原创 SmartInitializingSingleton和xxljob的故事
调用SmartInitializingSingleton类型接口的afterSingletonsInstantiated方法实现逻辑(而xxljob这个小家,实现了自己想要的afterSingletonsInstantiated方法)spring实例化对象,实例化单例对象后,去判断是否存在SmartInitializingSingleton类型的对象,存在这个类型的对象,XxlJobSpringExecutor 实现spring框架的接口(添加人的时候给每个人分配任务)xxljob是轻量级任务调度框架。
2022-09-28 16:59:01 149
原创 jpa 持久态,游离态,瞬态
指该实体对象处于Hibernate框架所管理的状态,也就是说这个实体对象是与Session对象的实例相关的。处于持久态的实体对象的最 大特征是对其所作的任何变更操作都将被Hibernate持久化到数据库中。表示该实体对象在内存中是自由存在的,也就是说与数据库中的数据没有任何的关联即,该实体从未与任何持久化上下文联系 过,没有持久化标识(相当与主键)。与数据库中的记录没有任何关联,也就是没有与其相关联的数据库记录 与Session没有任何关系,也就是没有通过Session对象的。
2022-09-27 13:50:16 932
原创 java规则引擎easy-rules
你自己定义的规则运算"condition":“(AlgorithmUtil.aa() && AlgorithmUtil.cc())”,facts.put(“class”, AlgorithmUtil.class);执行AlgorithmUtil里的aa()方法和cc()方法。B:为规则计算的数据。
2022-08-16 15:21:01 933
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人