![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java技术
文章平均质量分 88
分享java技术栈相关的一些技术文章,大部分都是原创
E等于MC平方
这个作者很懒,什么都没留下…
展开
-
记一次G1垃圾回收线上调优的实践
这说明遇到了瓶颈导致,于是我通过监控开始排查系统的瓶颈究竟在哪。排查了一圈,找到了一个可疑的点,我发现在压测期间,服务进行了600多次的GC,总的GC时间到达了2~5秒原创 2022-11-16 10:37:57 · 1220 阅读 · 0 评论 -
一文讲透java弱引用以及使用场景
这个线程的逻辑就是:不断的从Reference构成的pending链表上获取Reference对象,如果pending不为null,则将pending的对象进行clean,如果注册的时候有queue就进行enqueue,否则线程进行wait状态。原创 2022-05-05 21:23:50 · 5021 阅读 · 0 评论 -
腾讯云挂载数据盘以及mysql数据迁移至数据盘攻略
如果希望云服务器在重启或开机时能自动挂载数据盘,必须将分区信息添加到/etc/fstab中。原创 2022-05-02 17:17:42 · 3079 阅读 · 0 评论 -
都在说CI/CD,到底什么是CI/CD
当我们发布到生产环境时,通常不会马上进行全量的发布,而是先进行灰度部署。灰度部署是指逐渐将生产环境流量从老版本切换到新版本。通常流量是按比例分配的。例如 90% 的请求流向老版本,10% 的请求流向新版本。然后没有发现问题,就逐步扩大新版本上的流量,减少老版本上的流量。原创 2022-03-26 20:21:48 · 21997 阅读 · 1 评论 -
如何用AIO技术提高程序性能
AIO 可以帮助你构建更有效地使用可用 CPU 资源的应用程序。 虽然这种 I/O 模型与大多数 Linux 应用程序中的传统阻塞模式不同,但异步通知模型在概念上很简单,还可以简化你的设计。翻译 2022-02-01 20:47:03 · 1145 阅读 · 0 评论 -
用java构建构建可伸缩的高性能IO服务
主要介绍了如何在java中构建可伸缩的高性能IO服务,并且给出了Java网络编程中Reactor模式的几种实现,是一个非常好的学习资料翻译 2022-01-29 21:58:20 · 301 阅读 · 0 评论 -
Synchronization和java内存模型
java内存模型的目的是,每个线程都可以被认为是在与任何其他线程不同的CPU上运行。即使在多处理器上,这在实践中也很少见,但这种 CPU-per-thread 映射是实现线程的合理的方式之一,这一事实解释了该模型最初令人困惑的一些特性。 例如,由于 CPU 拥有其他 CPU 无法直接访问的寄存器,因此模型必须允许一个线程不知道另一个线程正在操作的值的信息。 然而该模型的影响绝不限于多处理器。 即使在单CPU系统上,编译器和处理器的操作也会导致相同的问题。翻译 2022-01-15 21:22:55 · 183 阅读 · 0 评论 -
Guava RateLimiter详解以及源码分析
文章目录Guava RateLimiter详解以及源码分析RateLimiter使用场景介绍RateLimiter使用示例RateLimiter原理及源码解读SmoothBurstySmoothWarmingUpGuava RateLimiter详解以及源码分析RateLimiter使用场景介绍首先你需要明白限流的概念,在高并发、高流量的场景中,我们的系统有时候会通过限流的手段来防止自己的系统被外部的流量打挂,是一种自我保护措施。有人可能会问,现在硬件资源成本越来越低,我难道不可以通过扩容的手段增加原创 2021-08-03 00:03:29 · 865 阅读 · 0 评论 -
一文带你入门flink sql
文章目录一文带你入门flink sql写在前面环境准备正文遇到的一些问题错误一错误二错误三一文带你入门flink sql写在前面本次实战主要是通过Flink SQL Client消费kafka的实时消息,再用各种SQL操作对数据进行查询统计。环境准备具体的环境安装过程就不在这里写了,网上很多资料,大家自己查阅按照就好了。我说下我本地的环境:flink 1.12.4mysql 8.0.25kafka 2.8.0另外就是,本次示例需要用到以下几个jar包:flink-sql-connec原创 2021-07-30 22:45:00 · 995 阅读 · 0 评论 -
G1回收加了这个配置?去财务把工资结一下
背景双十一之前检查下服务,通过监控的GC日志发现我们有个订单的服务Young GC时间似乎有点过长,有很多都到达秒级别了。 平时运行着其实还好也没出啥问题。但是考虑到双十一流量比较大,还是决定关注下这个问题。解决问题我们用的是G1垃圾回收器,我印象中G1是可以配置最大停顿时间的,赶紧去上去容器平台(我们的服务是部署在K8S上的)看了一下,确认了是配置了这个最大时间的停顿目标。-XX:MaxGCPauseMillis我们都知道GC停顿时间(stop the world)是垃圾回收器的一个非常重要的原创 2020-12-21 22:17:15 · 171 阅读 · 0 评论 -
一文说透如何同步的方式操作HashMap
写在前面很多人都知道HashMap是非线程安全的。比如下面这段代码,多运行几次,基本每次会抛出异常:final Map<Integer, String> map = new HashMap<>(); long count = 0; final Integer targetKey = 0b1111_1111_1111_1111; // 65 535 final String targetValue = "v"; m原创 2020-12-07 00:05:49 · 602 阅读 · 1 评论 -
lua执行redis脚本找不到脚本的问题
写在前面最近遇到了一个坑,给大家分享下。有个项目,利用redis做统计功能。一向对性能追求极致的我怎么能随便写几条redis的统计语句就应付呢。于是我打算使用lua脚本把用到的几条redis指令封装一起,这样减少和redis的IO交互,还可以保证操作原子性。我为自己的聪明才智沾沾自喜。脚本如下(下面并不是我项目中实际的脚本,做了一些修改,大家不用纠结语法和能否运行。不过不影响本文的分析):private final static String luaScript = "re原创 2020-09-01 18:20:42 · 1823 阅读 · 1 评论 -
线程池submit和execute,搞不好会引发线上故障
写在前面这两个方法都可以用来提交任务给线程池,但是又有所区别。我们先来看下二者的使用示例,先有个直观认识。execute的使用示例:public class ExecuteTest { private final static ThreadPoolExecutor executor = new ThreadPoolExecutor(0,1,0, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>()); publi原创 2020-07-21 20:01:31 · 1300 阅读 · 2 评论 -
几个小细节帮你提升java代码运行效率
引言千万不要小看代码细节的优化,有时候一个很小的优化就要你的代码执行效率数倍提升,如果这个优化点调用比较频繁,甚至有可能解决你整个系统的性能瓶颈。orElse和orElseGet官方文档上是这么说的,orElse:Return the value if present, otherwise return other.orElseGet:Return the value if present, otherwise invoke other and return the result of that原创 2020-07-08 23:16:54 · 246 阅读 · 0 评论 -
再聊聊fastjson的一个漏洞
引言我曾经写过一篇文章fastjson远程代码执行漏洞问题分析文章曾经比较详细分析了fastjson在1.2.24以及之前版本存在远程代码执行高危安全漏洞的问题。本文则是针对另一个漏洞的介绍和分析。官方对这次漏洞的说明是这样的:近日,阿里云应急响应中心监测到fastjson爆出远程拒绝服务漏洞,攻击者在请求中构造特定json字符串,可远程造成服务器内存和CPU等资源耗尽,最终拒绝服务...原创 2020-05-03 22:37:04 · 1419 阅读 · 4 评论 -
fastjson远程代码执行漏洞问题分析
背景fastjson远程代码执行安全漏洞(以下简称RCE漏洞),最早是官方在2017年3月份发出的声明,security_update_20170315没错,强如阿里这样的公司也会有漏洞。代码是人写的,有漏洞是难免的。关键是及时的修复。声明中,官方指出:最近发现fastjson在1.2.24以及之前版本存在远程代码执行高危安全漏洞,为了保证系统安全,请升级到1.2.28/1.2.29...原创 2020-03-01 16:15:11 · 5218 阅读 · 5 评论 -
带你了解下Kafka的客户端缓冲池技术
最近看kafka源码,着实被它的客户端缓冲池技术优雅到了。忍不住要写篇文章赞美一下(哈哈)。注:本文用到的源码来自kafka2.2.2版本。背景当我们应用程序调用kafka客户端 producer发送消息的时候,在kafka客户端内部,会把属于同一个topic分区的消息先汇总起来,形成一个batch。真正发往kafka服务器的消息都是以batch为单位的。如下图所示:这么做的好处显而易见...原创 2020-02-18 16:28:34 · 1493 阅读 · 0 评论 -
数据库连接池的原理没你想得这么复杂
背景介绍数据库连接池和线程池等池技术存在的意义都是为了解决资源的重复利用问题。在计算机里,创建一个新的资源往往开销是非常大的。而池技术可以统一分配,管理某一类资源,它允许我们的程序可以重复的使用这个资源,只有在极端情况下(比如连接池满)才会创建新的资源。数据库连接这种资源尤其昂贵,它的创建开销很大,大量的创建连接和释放操作对程序的影响非常明显。数据库连接池正是针对这个问题提出来的。实现原...原创 2020-02-16 09:58:50 · 512 阅读 · 0 评论 -
你真的会用volatile吗
文章目录volatile的概念volatile详解什么时候需要使用volatilevolatile在标准库里的应用volatile会降低程序执行的效率volatile不是万能的volatile的概念或者说,volatile解决什么问题?我自己的总结:volatile解决多线程下变量访问的内存可见性问题,用于线程间通信。通信怎能理解呢,线程A写一个volatile变量,随后线程B读这个vol...原创 2020-02-09 20:58:37 · 1735 阅读 · 0 评论 -
你真的了解LinkedBlockingQueue的put,add和offer的区别吗
概述LinkedBlockingQueue的put,add和offer这三个方法功能很相似,都是往队列尾部添加一个元素。既然都是同样的功能,为啥要有有三个方法呢?这三个方法的区别在于:put方法添加元素,如果队列已满,会阻塞直到有空间可以放add方法在添加元素的时候,若超出了度列的长度会直接抛出异常offer方法添加元素,如果队列已满,直接返回false索引这三种不同的方法在队列满...原创 2020-02-08 13:02:53 · 1172 阅读 · 0 评论 -
mac环境使用Apache ab工具测试服务性能
基本概念先引用一段官方介绍,ab is a tool for benchmarking your Apache Hypertext Transfer Protocol (HTTP) server. It is designed to give you an impression of how your current Apache installation performs. This es...原创 2020-02-03 21:57:57 · 1193 阅读 · 0 评论 -
关于Java使用groupingBy分组数据乱序问题
这是对最近做的一个项目,其中一个知识点的总结。真实的业务场景就不说了,我来模拟下业务场景,足够说明问题就行了。假设我有个对象,存储人员的基本信息,如下:@AllArgsConstructor@Data@ToStringpublic class PersonInfo { private String name; private int age; private i...原创 2020-01-28 11:14:36 · 1367 阅读 · 0 评论 -
详解 java CompletableFuture
文章目录背景知识基本介绍使用示例总结背景知识要理解 CompletableFuture,首先要弄懂什么是 Future。因为后者是前者的扩展。本文并不打算详细的介绍 Future,毕竟不是本文的重点。Future是java1.5增加的一个接口,提供了一种异步并行计算的能力。比如说主线程需要执行一个复杂耗时的计算任务,我们可以通过future把这个任务放在独立的线程(池)中执行,然后主线程继续...原创 2020-01-25 22:43:49 · 509 阅读 · 0 评论 -
从一个问题来加深对mysql可重复读的理解
引入问题这个问题来源于一个网络课程的课后思考题,题目是这样的:我用下面的表结构和初始化语句作为试验环境,事务隔离级别是可重复读。现在,我要把所有“字段 c 和 id 值相等的行”的 c 值清零,但是却发现了一个“诡异”的、改不掉的情况。请你构造出这种情况,并说明其原理。mysql> CREATE TABLE `test2` ( `id` int(11) NOT NULL, ...原创 2020-01-17 17:46:21 · 417 阅读 · 0 评论 -
dubbo服务接口设计的几个建议
文章目录尽量不用独立的多个参数接口最好带有版本信息尽量少用枚举类型作为参数总结尽量不用独立的多个参数比如我们有个dubbo的服务接口是这样定义的,public interface UserService { String sayHello1(String name);}服务实现示例如下:public class UserServiceImpl implements UserS...原创 2019-12-18 09:43:16 · 847 阅读 · 0 评论 -
这可能是讲雪花算法最全的文章
文章目录雪花算法的起源雪花算法原理雪花算法java实现一些细节讨论调整比特位分布workerid一般如何生成雪花算法的起源snowflake中文的意思是 雪花,雪片,所以翻译成雪花算法。它最早是twitter内部使用的分布式环境下的唯一ID生成算法。在2014年开源。开源的版本由scala编写,大家可以再找个地址找到这版本。https://github.com/twitter-archive...原创 2019-12-04 08:36:48 · 1524 阅读 · 0 评论 -
带你了解控制线程执行顺序的几种方法
通常情况下,线程的执行顺序都是随机的,哪个获取到CPU的时间片,哪个就获得执行的机会。不过实际的项目中有时我们会有需要不同的线程顺序执行的需求。借助一些java中的线程阻塞和同步机制,我们往往也可以控制多个线程的执行顺序。方法有很多种,本篇文章介绍几种常用的。利用 thread join实现线程顺序执行thread.join方法的可以实现如下的效果,就是挂起调用join方法的线程的执行,直到...原创 2019-11-15 19:31:35 · 1042 阅读 · 0 评论 -
一文说透访问者模式
基本介绍究竟什么是访问者模式呢?访问者模式(Visitor Pattern)模式是行为型(Behavioral)设计模式,提供一个作用于某种对象结构上的各元素的操作方式,可以使我们在不改变元素结构的前提下,定义作用于元素的新操作。如果系统的数据结构是比较稳定的,但其操作(算法)是易于变化的,那么使用访问者模式是个不错的选择;如果数据结构是易于变化的,则不适合使用访问者模式。总结起来一句...原创 2019-11-11 18:15:01 · 462 阅读 · 0 评论 -
map和object相互转换的几种方法和对比
工作中经常遇到这样的场景,需要在object和map直接相互转换,这里总结一下。我先定义一个实体类,后面介绍的几种转换方法都以这个实体类为例进行说明。public class PersonBean { private String name; //姓名 private Integer age; //年龄 private Boolean boy; //是否男孩 p...原创 2019-11-06 17:03:43 · 7277 阅读 · 0 评论 -
如何优雅的判断一个对象的属性是否全部为空
有一些业务场景下,我们需要判断某个对象的属性是否全部为空。该怎么做呢?马上能想到的一个方案是,一个一个判断对象中的属性。这个倒也可以,但是如果要判断的对象比较多,就得给每个对象写一个判断方法(因为每个对象的属性都不一样)。其实我们可以利用 java 的反射机制,比较优雅的实现。代码其实也很简单,public class ObjectIsNullUitl { public static...原创 2019-11-02 23:11:44 · 9891 阅读 · 0 评论 -
什么鬼,java线上内存溢出了?试试这个神器
MAT工具介绍工欲善其事必先利其器,学会使用工具也是一种本领。本篇文章就把自己之前工作中用到的一个内存分析工具给大家介绍下。内存分析工具MAT(Memory Analyzer Tool)是一款 JVM 的内存分析工具,在实际的工作中可以帮助我们解决生成上内存占用过高等问题。我之前用 MAT 是在 eclipse上使用,前者是后者的一个插件。后来换到 IDEA 才知道原来 MAT 也有独立的可...原创 2019-10-29 12:46:38 · 299 阅读 · 0 评论 -
如何打印GC日志排查问题
在工作当中,有时候我们会需要打印GC的相关信息来定位问题。该如何做呢?先来看个示例,public static void main(String[] args) { List<Integer> list0 = new ArrayList<>(); long start0 = System.currentTimeMillis(); ...原创 2019-10-26 16:27:37 · 1819 阅读 · 0 评论 -
springboot多数据源配置和使用
文章目录yml配置数据源config配置类mybatis接口和实现测试多数据源下的事务问题yml配置数据源这个直接把多个数据库连接信息写上即可,用spring.datasource属性进行配置,如下:spring: profiles: dev datasource: test1: jdbc-url: jdbc:mysql://10.204.58.202:3306/...原创 2019-10-25 18:54:49 · 556 阅读 · 0 评论 -
生产上遇到的一例mycat读写分离延时问题
问题描述场景是这样的,我们的支付系统在一笔支付完成后,需要发出通知给到商户。支付完成的消息通过消息队列发送给通知的服务。通知服务的有一部分处理逻辑是这样的: notifyPersist.saveNotifyRecord(notifyRecord); notifyRecord = rpNotifyService.getNotifyByMerchant...原创 2019-10-12 11:04:07 · 1405 阅读 · 0 评论 -
spring data jpa进阶
文章目录自定义SQL查询复杂查询如何实现关于事务原理概述不了解spring data jpa的建议先看我之前的文章spring data jpa入门示例自定义SQL查询mybatis擅长大量自定义查询的场景,spring data jpa虽然优势不在这里,但是也支持自定义SQL查询。它主要是通过@Query注解支持的。@Transactional@Modifying @Query("...原创 2019-07-04 14:23:40 · 321 阅读 · 1 评论 -
redis持久化方案介绍
文章目录基本介绍RDB介绍查看快照文件的信息触发RDB快照条件AOF介绍相关配置重写机制总结基本介绍本次演示使用的redis版本是3.2.100,操作系统是win10。redis支持两种持久化方案,RDB和AOF,前者是默认打开的,后者需要手动开启。我们通过配置文件可以验证这一点,RDB默认开启save 900 1save 300 10save 60 10000这三条配置是RDS...原创 2019-07-14 00:19:25 · 278 阅读 · 0 评论 -
spring data jpa入门示例
文章目录什么是JPAjava数据库编程的进化史spring data jpa的功能介绍使用示例测试什么是JPAJPA的全称是Java Persistence API,提供了一个规范,用于将数据通过Java对象持久化、读取和管理数据库中的关系表。所以JPA本质上就是一种ORM规范,它的目标是实现ORM的天下归一。java数据库编程的进化史这里我以自己的经历来简单说说。我刚接触java的时候...原创 2019-06-29 16:51:55 · 1120 阅读 · 0 评论 -
跟我学spring security系列文章第三章 Remember Me功能
文章目录示例实现原理分析源码地址:https://github.com/pony-maggie/spring-security-learnremember me(记住我)这个功能大家都很熟悉,现在各大网站用得很普遍。当我们勾选了这个功能并且登录成功后,在一定的时间内再次登录就不用输入用户名和密码了,即使浏览器退出重新打开也是如此。本文会实现一个基本的remember me功能,并且简单分析...原创 2019-07-14 17:49:43 · 1187 阅读 · 1 评论 -
idea debug高级特性看这篇就够了
文章目录多线程调试循环遍历条件断点显示方法返回值调试过程中动态修改变量的值调试内存泄露所谓工欲善其事必先利其器,从eclipse转idea也有一段时间了。一直想总结下idea调试的一些高级技巧。debug过程如果高效,撸代码也会爽很多,不是吗?多线程调试直接上例子说明,比如下面这段代码debug模式下调试的时候,发现断点并不会按照我预想的执行,子线程里的断点根本没有执行,两个子线程直接悄...原创 2019-08-14 19:57:04 · 1805 阅读 · 0 评论 -
一文带你了解logback的一些常用配置
文章目录springProfile标签中定义多个环境ThresholdFilter 日志过滤控制台输出日志引入默认配置springboot项目配置输出sqlspringProfile标签中定义多个环境我们可以通过springProfile为不同的环境配置不同的日志输出规则,比如生产环境不开启console,级别为info等 下面来看看示例,logback-spring.xml文件,<...原创 2019-09-12 11:25:19 · 602 阅读 · 0 评论