JAVA
文章平均质量分 79
阿里巴巴技术总指挥
这个作者很懒,什么都没留下…
展开
-
分布式事务Seata的常见问题
如果在1发生了全局的回滚,tx1此时没有本地锁,无法回滚,只持有全局锁,他的全局锁不不会释放了。导致tx2等待超时了,开始放弃去获取全局锁,并把自己的本地事务也回滚了,然后释放了本地锁。这是一个抽象出来的典型的分布式事务链路,3 个服务,分别有自己的数据库,服务调用形成一个业务链路,这个链路的数据要保障数据一致性。第一,利用了 数据库本地事务 的特性,让回滚日志和业务数据的写入保证原子性:只要有业务数据提交成功,就一定有相应的回滚日志数据。直接本地提交的机制,省去了绝大部分情况下,两阶段提交的开销。原创 2022-12-21 08:15:00 · 759 阅读 · 0 评论 -
JVM常见的问题
方法区:主要是存储类信息,常量池(static 常量和 static 变量),编译后的代码(字节码)等数据堆:初始化的对象,成员变量 (那种非 static 的变量),所有的对象实例和数组都要在堆上分配栈:栈的结构是栈帧组成的,调用一个方法就压入一帧,帧上面存储局部变量表,操作数栈,方法出口等信息,局部变量表存放的是 8大基础类型加上一个应用类型,所以还是一个指向地址的指针本地方法栈:主要为 Native 方法服务程序计数器:记录当前线程执行的行号。一般来说,Java应用的类都是由它来完成加载的。原创 2022-12-15 19:45:00 · 203 阅读 · 0 评论 -
集合框架-常见面试题总结
Segment 的结构和HashMap类似,是一种数组和链表结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素,每个 Segment 守护着一个HashEntry数组里的元素,当对 HashEntry 数组的数据进行修改时,必须首先获得对应的 Segment的锁。HashMap的数据结构: 在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。原创 2022-12-14 07:00:00 · 128 阅读 · 0 评论 -
线上遇到慢接口的解决方案
这个时候可以采用APM工具快速定位,常见的工具:skywalking、pinpoint,cat、zipkin假如我们应用没有接入APM,可以在生产环境装一下阿里的A.rthas,利用trace接口方法,大概能分析是哪一块比较慢,定位的力度稍微有点粗糙。. 循环调用改为单次调用(比如查数据库或查其他rpc或restful接口,能批量调用尽量批量调用,数据在内存组装处理).同步调用改为异步调用(采用completableFuture异步非阻塞,并行调用不同的rpc接口)我这里给大家分享以下。原创 2022-12-13 12:45:00 · 1097 阅读 · 0 评论 -
延时队列的设计:定时任务轮询、DelayQueue、时间轮算法、消息中间件、Redis
首先它要具有队列的特性,再给它附加一个延迟消费队列消息的功能,延迟队列相对比普通队列,区别就在延时的特性上,普通队列先进先出,按入队顺序进行处理,而延时队列中的元素在入队时会指定一个延时时间,希望能够在指定时间到了以后处理。时间轮算法,参考的时钟,从时钟中得到的一些启发设计出来的,简单的讲它是一个存储定时任务的环形队列,底层采用数组实现,数组中的每个元素可以存放一个延时任务列表。缺点∶缺乏队列顺序消息特性,相同score的任务无法顺序执行,缺乏ack特性,若任务执行失败,而队列的任务被删除了,就丢失了。原创 2022-12-13 09:00:00 · 2798 阅读 · 0 评论 -
线程池的使用ThreadPoolExecutor
线程池意味着可以储存线程,并让池内的线程得以复用,如果池内的某一个线程执行完了,并不会直接销毁它有生命周期,可以存活一些时间,待到下一个任务来时,它会复用这个在等待中的线程,避免了再去创建线程增加的额外系统开销。CachedThreadPool∶:允许的创建线程数量为Integer .NAX_VALE,可能会创建大量的线程,我们知道每个线程默认情况下占1M的内存空间,如果线程非常多,内存资源将会被耗尽,从而导致OOM。创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。原创 2022-12-12 05:35:37 · 1249 阅读 · 0 评论 -
性能优化-批量数据的导入导出处理
从产品侧设计的时候,引导产品,将导入导出功能设计成异步,尽量不要同步等待,虽然牺牲了一点体验,但是长期看对系统的稳定非常重要。(为了产品的体验,可以提供一个统一excel导入导出历史记录功能给产品或运营同学,支持查看对应的下载进度,可追溯),采用动态配置开关控制导入导出的数量,通过压测预估系统处理数据的阈值默认配置一个,导入导出超过阈值需要产品或运营发邮件申请,开发修改配置,如果业务确实有超大数据量要求,超过阈值太多,引导产品或运营分批导入导出解决。导入的痛点:一次加载百万级别数据到内存,发生OOM。原创 2022-12-11 07:07:39 · 1413 阅读 · 0 评论 -
实现完整统一响应对象
只有代码出错或者throw出来的异常才会被捕捉处理,如果被catch的异常,就不会被捕捉,除非catch之后再throw异常。3、定义一个处理返回结来的工具类RespResult.java,定义一些通用的返回结来的方法,例如返回成功结果的5Ucess方法、返回失败结果的error方法。,有多个GExceptionHandler注解的方法时,会根据抛出异常类去寻找处理方法,如果没有,就往上找父类,直到找到为止。1)返回http code 20e,对所有异常进行捕获,返回的message二次加工展示给调用方。原创 2022-12-11 10:15:00 · 453 阅读 · 1 评论 -
Java四种线程池和参数详解
一、四种线程池Java通过Executors提供四种静态方法来创建线程池例如://创建一个可缓存线程池ExecutorService cachedThreadPool = Executors.newCachedThreadPool();//执行任务cachedThreadPool.execute(Runnable command);如下:1.newSingleThreadPool 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO、LIFO、优先原创 2021-04-03 16:22:50 · 500 阅读 · 0 评论