java
文章平均质量分 84
太阳伞下的阿呆
愿天下的每个阿呆都能拥有一个可以依靠的太阳伞
展开
-
Java泛型类型解析
是针对类的字段,返回字段的泛型类型或具体类型。是针对类或接口,返回定义在类或接口上的类型参数。如果你想获取一个类中字段的实际类型,是合适的方法。如果你想获取类本身定义的类型参数,是正确的方法。表示的是已经用实际类型参数化的泛型类型。例如,是一个。表示的是泛型类型参数本身。例如,T在中是一个。表示完整的参数化类型,而表示泛型类型参数。第一种方式直接通过获取类型,类型信息在运行时已经被擦除,无法获取到实际的泛型类型。最终得到的Type t只是一个原始的类型,没有泛型信息。第二种方式在。原创 2024-09-07 07:38:17 · 920 阅读 · 0 评论 -
RateLimiter超时
tryAcquire的超时参数,是在预期超时之前能够获取到令牌才会阻塞等待,否则会理解返回获取失败。原创 2024-08-30 23:02:44 · 503 阅读 · 0 评论 -
Jvm G1与ZGC启动参数
�通过这些参数配置,你可以优化 ZGC 的性能,并获取详细的 GC 和内存分配日志,以便更好地监控和调优 JVM 的内存管理。设置 G1 堆区域的大小为 16M。这个值应该是 2 的幂次方,范围在 1M 到 32M 之间。启用垃圾回收日志文件轮转,最多保留 10 个日志文件,每个文件大小为 20M。这些参数是一个初始的优化建议,你可以根据实际应用的性能表现进行进一步的调整。启用详细的垃圾回收日志记录,并将日志输出到指定文件。内存不足时生成堆转储,并指定堆转储文件的路径。设置初始堆和最大堆大小为 4G。原创 2024-08-09 22:05:57 · 887 阅读 · 0 评论 -
应用卡顿排查
的合理性直接影响到 MySQL 的性能。一个合理的配置可以减少磁盘I/O,提高查询性能,优化数据库操作。以下是判断监控使用情况查看和相关状态变量。计算和配置按照内存总量的 70% 到 80% 来配置。调整基于实际监控数据和性能测试结果来调整。根据你的监控数据,当前的可能过小。虽然当前较高,但在高负载情况下可能会遇到性能瓶颈。建议增加并根据实际负载和数据量进行调整。同时,关注其他相关配置和硬件性能也很重要。原创 2024-07-28 08:37:12 · 437 阅读 · 0 评论 -
log4j2启动异步日志与动态修改日志级别
使用异步日志记录器可以全局地处理日志事件,使所有日志记录器异步地处理日志。使用异步追加器可以局部地将特定的追加器配置为异步。通过将日志事件放入队列中处理,异步日志记录可以显著提升应用程序的性能,特别是在高并发环境中。选择合适的方式来启用异步日志记录,并根据需要调整配置文件,以获得最佳性能和日志记录效果。通过以上方法,你可以在 Spring Boot 应用中动态修改日志级别,无论是通过 Actuator 提供的 HTTP 接口还是通过程序内的代码修改。原创 2024-07-21 06:22:31 · 918 阅读 · 0 评论 -
ForkJoinPool与ThreadPoolExecutor
ThreadPoolExecutor不多介绍,重点介绍ForkJoinPool,以及二者的区别ForkJoinPool 是 Java 7 引入的一种用于并行计算的框架,特别适合处理递归任务。它是 java.util.concurrent 包的一部分,基于工作窃取算法,可以充分利用多核处理器的并行能力。以下是 ForkJoinPool 的基本用法介绍。ForkJoinPool 基于两个核心操作:我们来实现一个简单的斐波那契数列计算例子。b. 合并排序下面是一个使用 ForkJoinPool 实现合并排序(原创 2024-06-29 10:49:51 · 847 阅读 · 0 评论 -
Spring Cloud、Spring Cloud LoadBalancer、Nacos 和 OpenFeign整合
版本。原创 2024-06-08 06:35:02 · 499 阅读 · 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 · 1920 阅读 · 1 评论 -
java性能分析async-profiler
项目地址。原创 2024-05-12 10:41:45 · 410 阅读 · 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 · 1002 阅读 · 0 评论 -
Disruptor概览
一文简短的文章帮助你掌握Disruptor设计原理原创 2024-03-23 10:54:47 · 666 阅读 · 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 · 1254 阅读 · 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 · 1794 阅读 · 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 · 13965 阅读 · 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 · 739 阅读 · 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 · 710 阅读 · 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 · 2170 阅读 · 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 · 2662 阅读 · 0 评论 -
踩点记录-_-!!!
为什么要用jdk17?检查Mapper响应类型没问题,那么就是缓存问题,查看userSwitch缓存配置为Boolean类型-.-!原因:如果缓存的key是常量,需要使用单引号将常量包起来。新增缓存并配置匹配的序列化类型。原因:lombok版本过低。解决方法:修改配置如下。原创 2022-10-29 21:26:14 · 513 阅读 · 0 评论 -
jdbc连接mysql8.x踩坑
使用jdbc连接数据库报错密码错误,提示检查编码使用手工连接数据库正常,密码没有问题。。。原创 2022-07-30 22:45:06 · 637 阅读 · 0 评论 -
shardingshpere客户端封装之泛型踩坑
环境:jdk11感觉也可以叫shardingsphere客户端踩坑记录-_-!!!报错很明确,类型转换错误,日志如下问题原因公司封装了sharding sphere客户端,抛出异常的代码第23行是: Long index = shardingValue.getValue() % availableTargetNames.size();完整源代码如下:问题定位很简单,增加断点发现入参的shardingValue.getValue()为Integer,该值取自数据库字段,数据库类型为int,因此出现了原创 2022-07-24 11:20:40 · 770 阅读 · 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 · 3386 阅读 · 2 评论 -
java虚表虚函数
虚函数实际是C++语言术语,主要功能是为了实现多态Java 虚函数C++中使用virtual修饰的普通成员函数为虚函数。Java没有虚函数的概念,它的普通函数就相当于C++的虚函数,动态绑定是Java的默认行为。如果Java中不希望某个函数具有虚函数特性,可以加上final关键字变成非虚函数。C++中纯虚函数Java中纯虚函数虚函数实现案例代码...原创 2022-07-10 16:20:28 · 781 阅读 · 0 评论 -
CopyOnWriteArrayList源码学习
常用ListList特点:有序,元素可能重复数据结构数组数组结构特点:适合随机读,写入性能比链表差ArrayList,并发不安全,读写均不加锁Vector,并发安全,读写均加锁CopyOnWriteArrayList,并发安全,读不加锁,写加锁链表数组结构特点:适合顺序读,写入性能比数组高LinkedList,并发不安全,读写均未加锁写addpublic void add(int index, E element) { final ReentrantLock原创 2021-09-05 22:33:10 · 158 阅读 · 0 评论 -
rocketmq可靠性
生产消息可靠性发送模式与可靠性模式性能可靠性SYNC快不丢失ASYNC快不丢失ONEWAY最快可能丢失生产者消息同步/异步发送请求,发送如果失败可以基于具体业务场景决定是否需要重试,保障消息推送成功。重试同步消息默认支持自动retry,默认配置为2(org.apache.rocketmq.client.producer.DefaultMQProducer#retryTimesWhenSendFailed)事务消息数据库更新逻辑与事务消息组合使原创 2021-06-13 14:46:11 · 477 阅读 · 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 · 647 阅读 · 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 · 792 阅读 · 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 · 1149 阅读 · 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 · 104 阅读 · 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 · 1496 阅读 · 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 · 122 阅读 · 0 评论 -
线程池之ThreadPoolExecutor(二)
属性静态属性COUNT_BITS=Integer.SIZE - 3=29;CAPACITY =00011111111111111111111111111111;RUNNING =11100000000000000000000000000000;SHUTDOWN =00000000000000000000000000000000;STOP =00100000000000000000000000000000;TIDYING =0100000000000000000000000原创 2021-03-27 16:45:55 · 212 阅读 · 0 评论 -
聊聊分布式锁
为什么需要分布式锁为什么需要?一定是有并发问题啊-_-。什么场景呢?例如我们现在常用的一个功能:登陆/注册。为毛呢?这是一个典型的saveOrupdate场景。如果用户不存在则注册(创建)用户,如果用户存在则直接登陆并更新用户登陆时间等等业务逻辑。如果没有锁会有啥问题呢?A同学是一个游手好闲家里有矿的富家子弟,所以有多款手记,闲着无聊的他使用两款手机同时使用一个手机号点击:登陆/注册服务启动两个线程处理两次请求。单线程不会有问题,现在木有这么单纯的服务了吧应该线程1查询数据库发现A同学不存在,则注原创 2021-03-21 18:20:42 · 203 阅读 · 0 评论 -
springboot内嵌Tomcat启动失败
问题描述开发需求期间引入友军的二方包,导致服务启动失败,失败日志如下java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMeth原创 2021-03-14 15:08:50 · 1751 阅读 · 0 评论 -
synchronized原理
原理synchronized代码块需要指定锁监视器对象,如果是实力方法则默认为实例对象。静态方法则为实例的class对象(全局唯一)。执行synchronized代码进入时会申请对象的monitor监视器monitorenter,如果已经线程获取了则判断是否当前线程,如果是则继续执行,锁计数器递增1,如果不是则阻塞等待。退出synchronized代码块时,锁计数器递减1,如果monitor监视器计数为0则退出monitor监视器对象monitorexit。案例非静态同步方法package com.原创 2021-03-07 20:42:36 · 117 阅读 · 3 评论 -
HashMap头插法
HashMap在1.8(不含)之前对于新增元素的hash冲突的链表插入采用的是头插法,1.8之后开始改用尾插法。那么头插法有什么问题呢?为什么改用尾插法呢?源码学习一下咯HashMap-jdk1.7.0_80put新增map元素public V put(K key, V value) { ... // 添加新元素 addEntry(hash, key, value, i); return null;}void addEntry(int hash, K key, V原创 2021-02-28 16:15:47 · 4885 阅读 · 3 评论 -
Unsafe.putOrderedInt源码学习
引言为什么突然要学习这个方法呢?看下我们上一篇翻译的文章就明白了,真的不是很好理解,不是立即可见那是顺序的吗?看方法名称Ordered应该是顺序的,那么究竟是不是呢?带着疑问去写个代码验证下吧 /*** * 设置对象指定下标处的Integer值为给定值。这是一个顺序的或者懒惰版本的 * putIntVolatile(Object,long,int)方法,它不保证值的改变对其他线程立即可见。 * 它仅对volatile修饰的Integer类型字段有用,并且适用于期望意外修改的场原创 2021-02-21 19:46:11 · 2575 阅读 · 2 评论 -
多线程顺序输出ABC
代码package com.gallant.test;/** * @author : 会灰翔的灰机 * @date : 2021/2/14 */public class AbcTask { private static final int COUNT = 10; public static void main(String[] args) { Object a = new Object(); Object b = new Object(); Object c原创 2021-02-14 23:40:30 · 366 阅读 · 1 评论 -
Jwt加解密-Java
工具类引入依赖包<dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.10.3</version></dependency>工具类package com.gallant.test;import com.auth0.jwt.JWT;import com.auth0.j原创 2021-02-06 22:26:13 · 1663 阅读 · 0 评论 -
Unsafe源码与翻译
翻译package sun.misc; import java.lang.reflect.Field; /*** * 该类提供“低级”操作,并且使用它被限于可信代码。字段可以使用内存地址访问, * 如果提供了无效的内存地址,则会发生未定义的行为 * * @author Tom Tromey (tromey@redhat.com) * @author Andrew John Hughes (gnu_andrew@member.fsf.org) */public class翻译 2021-01-24 21:44:47 · 158 阅读 · 0 评论