自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(95)
  • 资源 (5)
  • 收藏
  • 关注

原创 日志组件导致的内存溢出问题分析

查看 HttpServletRequest 说明发现该类包含大量的内部状态和引用,比如输入流、会话信息、请求头等,直接序列化这些信息可能会形成循环引用或过于庞大,导致序列化过程占用过多内存甚至进入无限循环。初看也没发现什么问题,断点发现卡在了 new Gson().toJson(arg) ,断点调试跟进发现入参类型为 HttpServletRequest ,难道它不可直接打印?普通的http请求,导致堆内存直接溢出,看了下代码实现非常简单的一次DB查询且数据量也比较小,不可能导致内存溢出呢。

2024-08-23 20:02:56 377

原创 分析 Runtime.getRuntime() 执行阻塞原因

猜测是流读取导致的阻塞,回到开始看下 Process 的源码,发现文档说明中表示 Runtime.exec()创建的子进程公用父进程的流,父进程的stream buffer可能被打满导致子进程阻塞,从而永远无法返回。因为错误的流读取方式导致线程阻塞,虽然调整成先读取正常 input 流可以正常运行了,但是也存在全部输入为异常流,正常流无法读取的情况,所以最好的方式还是异步同时读取俩种流。输入缓冲区空:如果子进程需要从标准输入(stdin)读取数据,而父进程没有及时提供输入,子进程将阻塞,等待输入数据。

2024-08-21 11:23:48 841

原创 synchronized 和 Lock 的对比

synchronized 关键字和 Lock 接口(特别是 ReentrantLock)是两种常用的线程同步机制。尽管它们都用于控制对共享资源的访问,但它们在功能和灵活性方面存在一些显著差异。

2024-07-08 21:45:27 399

原创 Springboot 文件传输优化

相反,Java NIO设计用来处理块或缓冲区的数据,一个缓冲区可以包含多个字节的数据,因此在处理大文件或频繁的文件操作时,性能可能更好。然而,这种方式仍然是在IO级别进行操作,并没有使用到NIO中的通道(Channel)和缓冲区(Buffer)机制,因此性能表现并不优秀。NIO提供了内存映射文件的支持,可以通过映射到内存的方式来直接操作文件,省去了内核空间和用户空间之间数据复制的开销。“零拷贝”可以减少用户空间和内核空间之间的数据拷贝,因此在处理大文件时,它的性能会比。接口简化了文件上传的处理。

2024-05-14 17:01:48 776 1

原创 开发利器 - docker 安装运行 mysql

-character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci 设置数据库默认编码。指定用户进入容器:docker exec -it mysql(容器名) mysql -uroot -p。本文选择安装的mysql版本为5.7 ,安装环境 mac。ps:推荐将影响容器运行模式的参数放在前面,比如。:指定容器名称,这里指定的名称为mysql。docker ps 查看运行的容器。:运行5.7这个版本的mysql。:对外映射容器内的端口号。

2024-05-11 14:46:40 478

原创 鸿蒙 ohpm 的异常报错

解压安装 ohpm , 进入 command-line-tools/ohpm/bin 目录执行 ohpm -v , 一直提示未初始化异常:ERROR: ohpm has not been initialized yet. Execute the init script to initialize it first. google搜索发现都是让配置环境变量、执行init脚本,尝试后都无法解决。执行 n 可以查看 当前已安装的版本,选择切换也可以直接执行 n use xx 切换版本。返回的数组上不存在。

2024-03-25 19:49:31 1028

原创 Java中常见的 IO 方式

冯·诺依曼结构中计算机结构被分为 5 大部分:运算器、控制器、存储器、输入设备、输出设备,输入设备向计算机输入数据,输出设备接收计算机输出的数据。从计算机结构的视角来看的话,。输入设备(比如键盘)和输出设备(比如显示器)都属于外部设备。网卡、硬盘这种既可以属于输入设备,也可以属于输出设备。所谓是操作系统为了保证操作系统的稳定性和安全性,将一个进程的地址空间划分为。我们运行的应用程序都是运行在用户空间,而只有内核空间才能进行系统态级别的资源有关的操作,比如文件管理、进程通信、内存管理等等。

2024-03-05 13:36:57 679 1

原创 nodejs 实现方法返回值常见方式

优点缺点回调函数简单易懂、兼容性好回调地狱:当有多个异步操作需要顺序执行或嵌套时,回调函数的嵌套层级会增加,导致代码难以维护和阅读错误处理复杂:需要手动处理错误传递,容易出现错误处理不当或遗漏的情况Promise 对象可读性强、错误处理简便:Promise 内置了错误处理机制,通过catch方法可以捕获并处理异常难以取消,无法处理同步异常,链式错误处理不方便,可能导致过多的嵌套同步风格(基于 Promise)、异常处理简单。

2024-03-04 20:27:42 1131

原创 git submodule 模块化管理

将不同的代码仓库嵌套到主仓库中,使得项目可以更好地组织和管理,每个子模块可以有自己的开发团队,可以独立地进行开发、测试和维护,从而提高团队的协作效率。同时Git Submodule 使用会让项目变的相对复杂,需要额外的命令和操作来管理子模块,当主仓库依赖多个子模块时,子模块之间的依赖关系可能会变得复杂。如果子模块之间存在依赖冲突或版本不兼容的情况,可能需要进行额外的调试和解决冲突的工作。

2024-02-27 19:04:16 723

原创 idea 创建打包 android App

1、gradle.properties 中 指定 jdk 版本:org.gradle.java.home=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home。安装 sdk:curl -s "https://get.sdkman.io" | bash。发现gradle 使用的是默认的 jdk8 版本,与工程要求的 11 版本不一致。c、安装 sdk 并通过 sdk 安装 gradle。解决后再次打包即可完成!a、下载安装 adb。

2024-02-26 11:18:56 3058

原创 问题排查利器 - 分布式 trace

分布式跟踪的目标是收集和分析整个分布式系统中的请求路径和性能数据,以便开发人员可以更好地理解系统中的瓶颈和问题。它通过在应用程序的不同组件之间传递唯一的标识符(通常称为跟踪 ID)来实现这一点,以便跟踪一个请求在系统中的流动。上图中的 span_id 可以理解为应用标记ID,而 trace_id 是请求标记ID,贯穿整个请求且保持不变的。当一个请求进入分布式系统时,它被赋予一个唯一的跟踪 ID。

2024-02-05 19:22:32 1682

原创 Springboot 快速集成 ES

如何使用 Spring Boot 快速集成 Elasticsearch 进行数据存储和检索操作。步骤包括添加依赖、配置连接、创建实体类、创建 Elasticsearch Repository、编写业务逻辑和运行应用程序。

2024-01-29 20:23:21 633

原创 ES 数据插入异常原因分析

Springboot 执行 ES 单元测试时发生上述异常 , 看提示应该是因为使用了 ignore_throttled 过期参数导致的,但是我的查询并没有使用这个字段,那它是从哪里来的呢?先 debug 查看异常处代码 Response.assertWarningValue这段代码是从 es 请求的响应中提取告警信息,判断是否符合断言,该正则表达式分为三部分对比运行时异常信息发现,299 Elasticsearch-7.17.13-2b211dbb8bfdecaf7f5b44d356bdfe54b10

2024-01-23 18:58:00 1541

原创 docker容器快速安装启动ES

macOS 上安装和快速启动 Elasticsearch

2024-01-22 19:48:59 1397

原创 Java 应用常见问题分析

在JVM中,常见的线上问题包括但不限于内存泄露、CPU飙升、线程死锁、响应变慢、垃圾回收问题、类加载问题、网络问题、日志问题、配置文件问题和安全性问题。这些问题可能会导致系统性能下降、应用程序崩溃、功能无法正常使用等严重后果。为了确保应用程序的稳定运行,需要定期监控和调优JVM,及时发现和解决这些问题。

2024-01-17 16:55:49 936

原创 Spring 中 HttpServletRequest 作为成员变量是安全的吗?

在使用spring框架开发的时候,经常会在controller类中看到HttpServletRequest对象参数,一般我们都是直接使用,但是它是何时、怎么注入到 spring 容器的呢 ?另外以成员变量注入的request 是线程安全的吗?

2024-01-17 15:06:15 1381

原创 并发必备技能 - 流量控制

一种基于令牌的流量控制算法。随着时间的推移,窗口不断向前滑动,旧的时间片段被丢弃,新的时间片段加入到流量计算中,举个例子:把1秒的时间窗口分为4分,每个窗口单独计数,每次请求到来时,统计的都是当前时间窗口 ~ 前3个窗口的总和,是否超出限制次数。限流是一种常见的服务保护策略,可以在整体服务、单个服务、单个接口、单个 IP 或 者单个用户等多个维度进行流量的控制,在实际使用中我们选择限流方式时,需要先了解系统需要的流量模式,评估不同算法的特性、复杂度和性能影响,进行实验和测试,根据结果选择最适合的算法。

2024-01-16 21:56:36 1030

原创 JVM 一些重要配置参数

目标不同:Parallel Scavenge 的目标是在减少垃圾收集停顿时间的同时,达到最大的吞吐量。而CMS收集器的目标是降低垃圾收集的停顿时间,提供更好的应用程序响应性。工作方式冲突:Parallel Scavenge 在新生代使用并行垃圾回收方式,而CMS收集器在老年代使用并发标记-清除方式。参数冲突:Parallel Scavenge 和 CMS收集器都有一系列的配置参数,用于调整它们的行为和性能。同时使用这两个收集器时,参数的配置可能会相互冲突,导致不一致的行为或性能问题。

2024-01-15 21:00:51 1297

原创 JVM主要的几种垃圾回收算法

然后,在整理阶段(Compact),将存活的对象压缩(Compact)到堆的一端,以释放不连续的内存空间。垃圾回收器通过追踪GC Roots对象的引用链,可以确定哪些对象是可达的,而哪些对象是不可达的,从而进行垃圾回收操作。: 在垃圾回收时,以 GC Roots 对象为根对象开始遍历对象图,确定哪些对象是可达的(即不会被回收),而哪些对象是不可达的(即可被回收)。JVM 内存模型中程序计数器、栈、本地方法栈这 3 个区域是线程私有的,与线程同生共死,不涉及回收,所以垃圾回收的就在剩下的堆和方法区中了,

2024-01-09 22:11:35 1180

原创 SpringBoot + Mybatis 实现多数据源原来如此简单

如图所示,sqlSessionFactory.getObject() 初始化时会调用 afterPropertiesSet() 方法,在这个方法中集中初始化,点进去查看源码,我们发现在MybatisSqlSessionFactoryBean#buildSqlSessionFactory 中会我们调用我们指定数据源的 getConnection 方法。常见的如读写分离,将读操作分散到读库中,减轻主数据库的负载,提高读取操作的性能。a、数据隔离:将不同的数据存储在不同的数据库中,如多租户场景。

2024-01-08 20:59:36 1150

原创 JVM内存模型理解

jvm内存模型定义了Java虚拟机运行时如何组织和管理内存,规定了各个内存区域的作用、结构和交互方式,以及线程间的内存可见性、内存操作的原子性等行为,以支持Java程序的执行,即一种约束或规定。

2024-01-02 21:53:09 866

原创 jdk 线程池与 tomcat 线程池对比

对比 Tomcat 线程池和 JDK 线程池,一个是线程数未达到最大线程数之前,优先创建线程执行任务,另一个是队列未满,优先让任务排队,总体而言tomcat线程池更适用于 IO 密集型应用场景,而对于CPU密集型任务,是更通用和灵活性更高一些。

2023-12-19 21:33:48 1855

原创 用好 mock 事半功倍

Mockito提供了强大的验证功能,支持验证模拟对象的方法调用次数、参数和顺序,以确保代码的预期行为,另外注解的支持可以轻松地创建和注入模拟对象,让测试代码更加简化,但是Mockito本身无法直接模拟静态方法和私有方法。对于这些场景,可以使用其他工具或者使用java代码直接构造。本次使用的mock工具为 mockito ,其中依赖的版本为 mockito-core:3.3.3。在Java开发中,Mock工具可用于单元测试和模拟对象的创建。

2023-12-13 16:53:46 428

原创 Kafka使用总结

根据局部性原理,通常刚被访问的数据在短时间内再次被访问的概率很高,PageCache用来缓存最近被访问的数据,当空间不足时淘汰最久未被访问的缓存,所以读磁盘数据的时,优先在 PageCache查找,如果数据存在则可以直接返回;程序在调用系统的API进行读写文件时,实际操作的都是 PageCache(文件在内存中缓存的副本)并不会直接去读写磁盘上的文件,大部分情况下,消费读消息都会命中 PageCache,一个是读取的速度会非常快,另外一个是,给写入消息让出磁盘的 IO 资源,间接也提升了写入的性能。

2023-12-11 20:38:52 1066

原创 浅析 spring 事件驱动

getTaskExecutor() 默认:org.springframework.core.task.SyncTaskExecutor。这是因为Spring的设计初衷是为了保证事件的有序处理和事务的一致性。1、松耦合:组件之间的通信通过事件进行,减少了直接依赖关系,提高了系统的灵活性和可扩展性。2、可扩展性:通过定义事件和监听器接口,可以方便地添加新的事件和监听器,扩展系统的功能。4、模块化开发:不同模块可以独立定义和实现自己的事件监听器,支持模块化开发和组装。

2023-09-15 18:29:05 378

原创 Redis cluster集群搭建

如果主节点设置了requirepass登录验证,在主从切换,slave在和master做数据同步的时候首先需要发送一个ping的消息给主节点判断主节点是否存活,再监听主节点的端口是否联通,发送数据同步等都会用到master的登录密码,否则无法登录,log会出现响应的报错。也就是说slave的masterauth和master的requirepass是对应的,所以建议redis启用密码时将各个节点的masterauth和requirepass设置为相同的密码,降低运维成本。4、拷贝配置文件到指定目录。

2023-09-14 17:30:20 335

原创 远程debug调试

JDWP协议规范文档 https://docs.oracle.com/javase/8/docs/technotes/guides/jpda/jdwp-spec.html。a、参数含义:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000。suspend:在启动时是否就等待,表示程序一启动就停下,等待远程调试 socket 和它建立连接。transport:传输规范,用 JDWP 调试程序一般叫做:dt_socket。

2023-07-04 15:24:18 425

原创 maven相关

maven总结

2022-10-12 21:09:14 361 1

原创 Spring Boot 2.6后启动时报错 BeanCurrentlyInCreationException

问题:org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'tallyMonthServiceImpl': Requested bean is currently in creation: Is there an unresolvable circular reference?

2022-09-15 21:26:45 281

原创 常用的一些工具方法封装

利用@Aspect实现一个日志记录插件

2022-07-30 23:41:31 223

原创 Spring Aop问题汇总

HandlerInterceptorspringMVC中的拦截器(handler是方法),拦截的是请求(RequestMappingHandler)MethodInterceptorspringaop包中的功能,利用AOP机制实现,拦截是spring代理的方法。a、自定义拦截器,继承MethodInterceptor重写invoke。拦截器的功能登陆验证、日志耗时打印、权限认证、数据校验、预置自定义数据等。a、自定义拦截器实现HandlerInterceptor接口。自定义注解并启用注解。...

2022-07-30 23:34:53 291

原创 ThreadLocal总结

JDK在设计时也考虑到key被收到时导致内存泄漏问题,在调用ThreadLocal中set、remove、rehash时会扫描key为null的entry,并将value置为null,避免内存泄漏,但是这种需要调用threadLocal的这些方法时才能触发,如果此时threadlocal已经被回收了还是会存在内存泄漏问题,最好的还是我们再不使用时,手动调用remove处理。a、栈为强引用、entry的key为弱引用,栈方法执行结束后此时可以正常回收threadlocal对象。...

2022-07-24 16:33:10 1307 1

原创 日志异常分析记录

logback异常问题分析

2022-07-04 23:10:56 4906 1

原创 常见MQ应用与总结

MQ的应用场景:异步处理(流程异步化,提高响应速度)、流量控制(消峰填谷,根据下游处理能力自动调节流量)、服务解藕、流计算

2022-06-06 01:18:14 460 1

原创 JVM 垃圾回收

JVM 垃圾回收

2022-06-01 20:45:39 561

原创 git 常用命令记录

1、常用命令图出自:Git 常用命令大全git reflog (Reference logs): 查看所有分支的所有操作记录信息(包含已经被删除的 commit 记录和 reset 的操作),reflog属于本地存储,用于记录用户的本地操作,并不在Git仓库中存储,常用于恢复本地的错误操作(版本回退或恢复)git log:查看当前分支所有提交过的版本信息(不包括已经被删除的 commit 记录和reset的操作)--pretty=oneline只显示版本号、提交时备注信息.....

2022-05-31 16:10:59 1880

原创 JVM的内存模型(Java Virtual Machine Structure)

JVM 包含 Java 字节码的分析(JIT compiler)和 执行(Runtime),内置自动内存分配管理机制,避免手动分配回收机制可能带来的内存泄露和内存溢出风险,让Java 开发人员不再需要关注每个对象的内存分配和回收问题,更专注于业务实现,提高开发效率,同时也会导致开发人员过度依赖于自动化,弱化对内存的管理能力,系统很容易发生 JVM 的堆内存异常、垃圾回收(GC)的方式不合适、 GC 次数过于频繁等问题,直接影响应用服务性能。一、内存模型jdk1.8中运...

2022-05-30 17:09:55 138

原创 分布式选举算法

分布式系统常见选举算法:基于序号选举的算法(Bully 算法)、多数派算法(Raft 算法、ZAB 算法)等一、Bully 算法1、集群节点角色类型 主节点、普通节点,主节点负责对其他节点的协调和管理2、选举策略在所有活着的节点中,选取 ID 最大的节点作为主节点,当选主成功后,有且仅有一个节点成为主节点,其他所有节点都是普通节点,当且仅当主节点故障或与其他节点失去联系后,才会重新选主。3、选举过程a、选举使用到的消息Elect.........

2022-05-26 15:51:15 2461 1

原创 分布式通用概念常识

一、常见指标理解1、吞吐量(Throughput)、响应时间(Response Time)、完成时间 (Turnaround Time)a、吞吐量(Throughput): 系统在一定时间内可以处理的任务数,可以直接体现一个系统的性能,吞吐量的衡量指标如下: QPS(Queries Per Second) 系统在给定响应时间下每秒可处理的查询数,通常用于读操作,越高说明对读操作的支持越好 TPS(Transactions Per Second)

2022-05-26 09:29:14 121

原创 Thread 多线程总结

线程使用总结

2022-04-15 00:44:35 455

excel导入导出性能优化

由于excel导出属于可预估的内存消耗型功能,其对资源的消耗根据任务并发数量可能会影响该功能所在的JVM进程健康,则忧进行优化

2019-04-03

J2SE各个版本帮助文档

J2SE各个版本帮助文档、XPathTutorial(菜鸟必备)和 dom4j

2016-07-28

J2SE帮助文档

J2SE6.0英文版帮助文档

2016-07-28

颜色选择js

颜色选择js

2016-07-14

多线程下载+进度条

进度条下载,实现实时更新实时下载的功能......

2015-08-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除