
java
文章平均质量分 84
太阳伞下的阿呆
愿天下的每个阿呆都能拥有一个可以依靠的太阳伞
展开
-
java写文件优化(1)
增大缓冲区:可以尝试增大的缓冲区,以减少 I/O 次数。多线程异步写入:对于多个文件或大文件,使用线程池并行写入会提高效率。内存映射文件(Memory-mapped files):对于非常大的文件,内存映射文件的方式能显著提高性能。:对于小文件,是一个简单且高效的选择。去掉不必要的封装:如果没有计数需求,避免使用,只保留进行写入。选择合适的方案,依据你的实际数据规模和场景来优化文件写入性能。增大缓冲区大小。原创 2025-04-04 15:01:37 · 598 阅读 · 0 评论 -
package-info.java的作用
是一个为包提供额外元数据的文件,主要用于文档说明、声明包级注解,以及统一管理包的整体信息。虽然不是必需的,但它是一个非常有用的工具,特别是在注释、文档生成和注解的使用场景中。原创 2025-02-28 20:46:35 · 333 阅读 · 0 评论 -
Spring boot对接安全证书
如果只是短期需要继续使用 CentOS 8,可以切换到 Vault 存储库。如果需要长期支持,建议迁移到 AlmaLinux 或 Rocky Linux,以获得社区支持和定期更新。原创 2025-01-01 13:07:46 · 1462 阅读 · 0 评论 -
kafka-clients之ProducerConfig
在Kafka2.4.0版本中,类提供了许多配置参数,用于控制生产者行为。这些参数可以调整Kafka生产者的性能、可靠性和行为。原创 2024-11-09 09:43:32 · 962 阅读 · 0 评论 -
kafka客户端消费者吞吐量优化
mq消息消费实时性要求不高,期望可以牺牲一部分实时性,换取吞吐量,例如:数据库单条insert优化为batchInsert。优化后结果不符合预期:消费者消费消息的batchSize远小于实际配置的max.poll.records,导致在批量消息达到时想要聚合mq批量操作业务数据效果与单条处理效果类似。的等待时间内,broker 至少有足够的时间来积累消息,最大限度地提高单次拉取的数据量。这个参数决定了消费者拉取消息时的行为,影响数据批量处理的效率和延迟。,尤其是在消息量较小的场景中。这种配置的好处是可以。原创 2024-11-02 11:37:13 · 1508 阅读 · 0 评论 -
kafka-clients之mq丢失问题
客户端版本为2.6.x,客户端机器可能在尝试连接 Kafka broker 时因为超时断开,导致无法成功接收或更新 metadata由于客户端没有及时感知到broker重新选举的metadata数据,一直尝试向宕机的broker发送mq,在2分钟后超时,最终失败导致部分mq消息丢失如何解决该问题场景?升级版本至2.7.0(含)之上。官方如何修复的该问题可配置的连接超时:引入了参数,允许客户端配置连接建立的超时时间。如果客户端在设定的时间内无法与 broker 建立连接,它将超时并进行失败处理。原创 2024-10-26 07:29:34 · 1172 阅读 · 0 评论 -
G1(Garbage First)垃圾回收实战
年轻代回收(Young GC):只回收新生代,暂停时间短。并发标记:标记老年代中的存活对象,尽量避免停顿。混合回收(Mixed GC):回收新生代和部分老年代对象,减少 Full GC 触发的频率。完全垃圾回收(Full GC):应急阶段,全堆回收,停顿时间长。通过这些阶段的配合,G1 能够平衡应用的吞吐量和暂停时间,适合大堆内存、低延迟要求的应用场景。这表示 G1 垃圾回收器在执行一次 Young GC(年轻代垃圾回收)。原创 2024-10-19 09:07:01 · 1095 阅读 · 1 评论 -
Java内存布局
64位 JVM 不启用指针压缩时:Object Header 大小是16字节。64位 JVM 启用指针压缩时(默认):Object Header 大小是12字节。32位 JVM:Object Header 大小是8字节。JVM在默认情况下启用指针压缩,但如果堆内存超过32GB,就会禁用指针压缩。32GB是压缩指针的最大寻址范围。超过32GB的堆内存中,压缩指针带来的性能提升并不显著,而且需要解压指针反而可能增加开销。原创 2024-10-01 09:29:45 · 1035 阅读 · 0 评论 -
Java泛型类型解析
是针对类的字段,返回字段的泛型类型或具体类型。是针对类或接口,返回定义在类或接口上的类型参数。如果你想获取一个类中字段的实际类型,是合适的方法。如果你想获取类本身定义的类型参数,是正确的方法。表示的是已经用实际类型参数化的泛型类型。例如,是一个。表示的是泛型类型参数本身。例如,T在中是一个。表示完整的参数化类型,而表示泛型类型参数。第一种方式直接通过获取类型,类型信息在运行时已经被擦除,无法获取到实际的泛型类型。最终得到的Type t只是一个原始的类型,没有泛型信息。第二种方式在。原创 2024-09-07 07:38:17 · 1092 阅读 · 0 评论 -
RateLimiter超时
tryAcquire的超时参数,是在预期超时之前能够获取到令牌才会阻塞等待,否则会理解返回获取失败。原创 2024-08-30 23:02:44 · 637 阅读 · 0 评论 -
Jvm G1与ZGC启动参数
�通过这些参数配置,你可以优化 ZGC 的性能,并获取详细的 GC 和内存分配日志,以便更好地监控和调优 JVM 的内存管理。设置 G1 堆区域的大小为 16M。这个值应该是 2 的幂次方,范围在 1M 到 32M 之间。启用垃圾回收日志文件轮转,最多保留 10 个日志文件,每个文件大小为 20M。这些参数是一个初始的优化建议,你可以根据实际应用的性能表现进行进一步的调整。启用详细的垃圾回收日志记录,并将日志输出到指定文件。内存不足时生成堆转储,并指定堆转储文件的路径。设置初始堆和最大堆大小为 4G。原创 2024-08-09 22:05:57 · 1066 阅读 · 0 评论 -
应用卡顿排查
的合理性直接影响到 MySQL 的性能。一个合理的配置可以减少磁盘I/O,提高查询性能,优化数据库操作。以下是判断监控使用情况查看和相关状态变量。计算和配置按照内存总量的 70% 到 80% 来配置。调整基于实际监控数据和性能测试结果来调整。根据你的监控数据,当前的可能过小。虽然当前较高,但在高负载情况下可能会遇到性能瓶颈。建议增加并根据实际负载和数据量进行调整。同时,关注其他相关配置和硬件性能也很重要。原创 2024-07-28 08:37:12 · 489 阅读 · 0 评论 -
log4j2启动异步日志与动态修改日志级别
使用异步日志记录器可以全局地处理日志事件,使所有日志记录器异步地处理日志。使用异步追加器可以局部地将特定的追加器配置为异步。通过将日志事件放入队列中处理,异步日志记录可以显著提升应用程序的性能,特别是在高并发环境中。选择合适的方式来启用异步日志记录,并根据需要调整配置文件,以获得最佳性能和日志记录效果。通过以上方法,你可以在 Spring Boot 应用中动态修改日志级别,无论是通过 Actuator 提供的 HTTP 接口还是通过程序内的代码修改。原创 2024-07-21 06:22:31 · 1455 阅读 · 0 评论 -
ForkJoinPool与ThreadPoolExecutor
ThreadPoolExecutor不多介绍,重点介绍ForkJoinPool,以及二者的区别ForkJoinPool 是 Java 7 引入的一种用于并行计算的框架,特别适合处理递归任务。它是 java.util.concurrent 包的一部分,基于工作窃取算法,可以充分利用多核处理器的并行能力。以下是 ForkJoinPool 的基本用法介绍。ForkJoinPool 基于两个核心操作:我们来实现一个简单的斐波那契数列计算例子。b. 合并排序下面是一个使用 ForkJoinPool 实现合并排序(原创 2024-06-29 10:49:51 · 1024 阅读 · 0 评论 -
Spring Cloud、Spring Cloud LoadBalancer、Nacos 和 OpenFeign整合
版本。原创 2024-06-08 06:35:02 · 599 阅读 · 0 评论 -
spring-boot整合Micrometer+Prometheus
Micrometer可以整合Prometheus也可以整合influxDB等时序数据库,主要作用就是桥接,类似于Slf4j与log4j,logback的关系。提供一个通用的打点能力,并将打点数据对接到相应的时序数据库,用户只需要关心何时打点即可。桥接包中的io.micrometer.prometheus.PrometheusMeterRegistry,将打点数据桥接至io.prometheus.client.CollectorRegistry。原创 2024-05-18 07:28:37 · 2887 阅读 · 1 评论 -
java性能分析async-profiler
项目地址。原创 2024-05-12 10:41:45 · 575 阅读 · 0 评论 -
Java线程亲和实战
环境:Linux version 5.4.0-1084-aws (buildd@lcy02-amd64-044) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #91~18.04.1-Ubuntu SMP Sun Aug 14 01:24:43 UTC 2022。原创 2024-04-06 23:13:12 · 1048 阅读 · 0 评论 -
Disruptor概览
一文简短的文章帮助你掌握Disruptor设计原理原创 2024-03-23 10:54:47 · 726 阅读 · 0 评论 -
spring-cloud-loadbalancer-3.1.1版本bug踩点记录
问题复现后基本原因也很明确了,问题出现在第2147483462次递增,也就是num=185+2147483462=2147483647,那么此时2147483647递增后结果为-2147483648。abs对-2147483648求值结果为2147483648。对整形熟悉的朋友都知道,整形的范围是:-2147483648 至 2147483647。查看abs源码如下。代码很简单,如果是负数直接取-a。也就是说绝对值2147483648对于整形发生了越界,即得到结果是一个负数:-2147483648。原创 2024-02-24 09:43:56 · 1349 阅读 · 0 评论 -
JMeter压测
软件:jetty:jetty-io-9.4.22.v20191022.jar,spring-boot-2.2.1.RELEASE.jar,mysql:Ver 8.0.29硬件:mac:内存16G,磁盘HD 1T,cpu:Apple M1 Pro,核总数: 10(8性能和2能效),网络:电信100M下载地址:https://jmeter.apache.org/download_jmeter.cgi例如mac/linux可以选择:https://dlcdn.apache.org//jmeter/bina原创 2023-03-12 11:13:58 · 2116 阅读 · 0 评论 -
Could not extract response: no suitable HttpMessageConverter
版本:spring-cloud-openfeign-core-2.1.1.RELEASE.jar,spring-webmvc-5.1.14.RELEASE.jar,jetty-server-9.4.41.v20210516.jar,tomcat-embed-core-9.0.48.jar。原创 2023-02-26 15:35:08 · 14681 阅读 · 0 评论 -
GC中的一些设计
个人认为还有一个前提是使用了标记-整理算法,不存在内存碎片,新对象不会被分配至碎片内存中。标记过程中修改了引用关系,B.C=null,A.D=D,此时如果不做特殊处理的话,那么D会被误杀,因为A已经为黑色标记完成,不会再尝试去标记它的子节点D。CMS解决方法是针对条件1:新增黑色节点对白色节点引用时会将新引用关系的引用者(黑色节点)标记为灰色。G1/ZGC解决方法是针对条件2:删除灰色节点对白色节点引用时会将老引用关系的被引用者标记为灰色。通常有两种方法记录引用关系:Point In/Point Out。原创 2023-01-07 14:55:20 · 786 阅读 · 0 评论 -
Elasticsearch学习
每个shard向cooridinating节点返回足够的信息,以允许它合并与重排序shard级别的结果至一个全局排序的结果集,结果集最大长度为请求需求的size。与"Query Then Fetch"相似,区别是初始分发阶段,它会去计算分布式TF值,以获取更准确的评分。与query_then_fetch区别在于,只有一个阶段,第一阶段就返回文档内容,即将两个阶段合二为一了。查询Segment缓存中的数据,因此ES是一个近实时数据,默认写入的数据1S内进入Segment。hot数据迁移至warm节点。原创 2023-01-01 22:20:19 · 787 阅读 · 0 评论 -
Es客户端学习
版本:opensearch-rest-high-level-client-2.3.0.jar,httpcore-nio-4.4.11.jar,httpasyncclient-4.1.4.jar。原创 2022-12-25 12:09:46 · 2370 阅读 · 0 评论 -
apollo分布式配置优先级学习
apollo/properties配置spring读取配置阿波罗在spring上下文刷新前加载配置至Environment环境配置的第一优先级位置:com.ctrip.framework.apollo.spring.boot.ApolloApplicationContextInitializer#initialize(org.springframework.context.ConfigurableApplicationContext)原创 2022-11-13 13:41:22 · 2884 阅读 · 0 评论 -
踩点记录-_-!!!
为什么要用jdk17?检查Mapper响应类型没问题,那么就是缓存问题,查看userSwitch缓存配置为Boolean类型-.-!原因:如果缓存的key是常量,需要使用单引号将常量包起来。新增缓存并配置匹配的序列化类型。原因:lombok版本过低。解决方法:修改配置如下。原创 2022-10-29 21:26:14 · 550 阅读 · 0 评论 -
jdbc连接mysql8.x踩坑
使用jdbc连接数据库报错密码错误,提示检查编码使用手工连接数据库正常,密码没有问题。。。原创 2022-07-30 22:45:06 · 858 阅读 · 0 评论 -
shardingshpere客户端封装之泛型踩坑
环境:jdk11感觉也可以叫shardingsphere客户端踩坑记录-_-!!!报错很明确,类型转换错误,日志如下问题原因公司封装了sharding sphere客户端,抛出异常的代码第23行是: Long index = shardingValue.getValue() % availableTargetNames.size();完整源代码如下:问题定位很简单,增加断点发现入参的shardingValue.getValue()为Integer,该值取自数据库字段,数据库类型为int,因此出现了原创 2022-07-24 11:20:40 · 851 阅读 · 0 评论 -
Could not determine which parameter to assign generated keys to
环境:jdk11,generator插件增强包:com.itfsw(1.2.4)generator配置问题原因问题原因报错中提示很清晰,报错是由Jdbc3KeyGenerator抛出,就是说由于sql语句存在多个参数,回填主键时无法确定将主键回填给哪个字段我们配置了identity,所以主键回填应该使用,但实际使用的Jdbc3KeyGenerator,而不是SelectKeyGenerator。其实只有扩展的batch部分没有使用selectKey,其他insert相关方法都是使用的selectK原创 2022-07-17 09:17:41 · 3566 阅读 · 2 评论 -
java虚表虚函数
虚函数实际是C++语言术语,主要功能是为了实现多态Java 虚函数C++中使用virtual修饰的普通成员函数为虚函数。Java没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行为。如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数。C++中纯虚函数Java中纯虚函数虚函数实现案例代码...原创 2022-07-10 16:20:28 · 838 阅读 · 0 评论 -
CopyOnWriteArrayList源码学习
常用ListList特点:有序,元素可能重复数据结构数组数组结构特点:适合随机读,写入性能比链表差ArrayList,并发不安全,读写均不加锁Vector,并发安全,读写均加锁CopyOnWriteArrayList,并发安全,读不加锁,写加锁链表数组结构特点:适合顺序读,写入性能比数组高LinkedList,并发不安全,读写均未加锁写addpublic void add(int index, E element) { final ReentrantLock原创 2021-09-05 22:33:10 · 185 阅读 · 0 评论 -
rocketmq可靠性
生产消息可靠性发送模式与可靠性模式性能可靠性SYNC快不丢失ASYNC快不丢失ONEWAY最快可能丢失生产者消息同步/异步发送请求,发送如果失败可以基于具体业务场景决定是否需要重试,保障消息推送成功。重试同步消息默认支持自动retry,默认配置为2(org.apache.rocketmq.client.producer.DefaultMQProducer#retryTimesWhenSendFailed)事务消息数据库更新逻辑与事务消息组合使原创 2021-06-13 14:46:11 · 531 阅读 · 0 评论 -
聊聊1.8版ConcurrentHashMap优化
hash冲突链表结构优化hash冲突的链表长度超过阈值TREEIFY_THRESHOLD=8则转为红黑树结构为什么阈值为8?红黑树平均查找时间复杂度log(N),log(8)=3,链表平均查找长度为N/2,8/2=4,转换后性能更高理想情况下,hash桶中节点的频率遵循泊松分布,桶长度超过8的概率非常小,约为6*10的负8次方,通常情况下不回发生结构转换为什么不直接使用红黑树?因为二叉树(红黑树其实是一种二叉树)虽然查询效率高,但是空间开销非常大,单个 TreeNode 需要占用的空间大约原创 2021-05-30 21:50:01 · 695 阅读 · 0 评论 -
guava限流超限问题
问题描述前期测试期间设置:线程池fix大小3,限速2,但是出现了同时3个线程获取到令牌的场景,日志如下2021-05-20 10:50:51.325 [0b17349516214790512533803e2612] [SystemReport-TP-0] INFO c.d.m.manager.IAcsClientManager:65 - returnAcsClient=client-1, rate=2.02021-05-20 10:50:51.325 [0b173495162147905125338原创 2021-05-23 22:32:14 · 858 阅读 · 0 评论 -
无限循环小数展示算法题
题目给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。示例 1:输入: numerator = 1, denominator = 2输出: “0.5”示例 2:输入: numerator = 2, denominator = 1输出: “2”示例 3:输入: numerator = 2, denominator = 3输出: "0.(6)”实现package com.galla原创 2021-05-16 08:54:13 · 1218 阅读 · 0 评论 -
链表算法
从尾到头打印链表实现结合栈结构实现package com.gallant.test;import java.util.Stack;import lombok.Builder;import lombok.Data;/** * @author : 会灰翔的灰机 */public class LinkedListAlgorithm1 { private static LinkNode init(int size) { LinkNode root = null; Lin原创 2021-05-01 10:53:08 · 124 阅读 · 0 评论 -
dubbo泛化调用踩坑精度问题
问题背景开放平台对接外部服务暴露http接口,然后http接口请求根据参数将请求分发至内部dubbo服务,分发动作使用的。计费接口测试时发现cost字段(BigDecimal)出现精度问题测试数据的cost值为0.01http网关服务日志,可以看到入参的cost=0.01,没有问题2021-04-22 10:40:18,597 INFO [4fb5b4087d2c462eab8b9ede87b8d272] [DubboServerHandler-10.200.25.210:16976-thread-原创 2021-04-24 16:30:05 · 1643 阅读 · 0 评论 -
Java垃圾收集器(GC)
对象是否可回收引用计数算法概念:当有一个地方引用一个对象,就对其+1,引用失效就-1,当引用数为0时,便可以回收缺点:循环依赖问题。对象A引用对象B,对象B引用对象C,对象C引用对象B。对象A取消对象B的引用。此时对象B与对象C已经没有任何外部引用,可以回收,但是由于内部互相的引用导致计数器不为0而无法回收它们可达性分析算法概念:算法定义了“GC Root”节点,以GC Root为起点向下搜索,引用链可达的对象则判定它为存活。不可达的对象即可回收哪些对象可以作为GC Root对象?虚拟机栈(原创 2021-04-18 18:19:05 · 150 阅读 · 0 评论 -
线程池之ThreadPoolExecutor(二)
属性静态属性COUNT_BITS=Integer.SIZE - 3=29;CAPACITY =00011111111111111111111111111111;RUNNING =11100000000000000000000000000000;SHUTDOWN =00000000000000000000000000000000;STOP =00100000000000000000000000000000;TIDYING =0100000000000000000000000原创 2021-03-27 16:45:55 · 242 阅读 · 0 评论