JAVA
文章平均质量分 68
yzh_1346983557
做一个有思想有灵魂的。。。“码农”
展开
-
JVM调优实战:to-space exhausted & Evacuation Failure
一次线上dubbo问题的定位,进行JVM调优实战。原创 2023-01-18 16:53:21 · 2449 阅读 · 0 评论 -
Redisson自定义序列化
项目之前使用的RestTemplate api,RestTemplate的序列化使用的RedisSerializer接口,使用的实现类Jackson2JsonRedisSerializer。现在改为使用RedissonClient,RedissonClient的序列化使用的Codec接口,默认实现类JsonJacksonCodec。原创 2023-01-10 20:06:38 · 6772 阅读 · 0 评论 -
java list分批
对集合数据分次批量处理,防止数据IO突增带来问题。原创 2023-01-09 10:38:56 · 1163 阅读 · 0 评论 -
规则引擎groovy
重量级方案:Acitivities、drools,适合复杂业务场景的规则引擎。轻量级方案:groovy脚本。原创 2022-08-21 18:33:33 · 3116 阅读 · 0 评论 -
easyexcel 的使用
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;原创 2021-12-04 23:33:04 · 3831 阅读 · 0 评论 -
查看Java进程的pid
1、jps./jps -v-v:输出jvm参数2、psps aux | grep java原创 2021-10-30 16:20:00 · 2184 阅读 · 0 评论 -
Java 线程池原理总结,结合源码
线程池(Thread Pool)是一种基于“池化”思想管理线程的工具,好处:降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。提高响应速度:任务到达时,无需等待线程创建即可立即执行。提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。提供更多更强大的功能:线程池具备可拓展性,允许开发人员向其中增加更多的功能。比如延时定时线程池ScheduledThr原创 2021-10-02 23:53:46 · 751 阅读 · 0 评论 -
Apache POI的使用:读取excel文件
一、导包 <!-- 操作2003版本的excel,以.xls结尾的 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </de原创 2021-09-30 15:43:12 · 759 阅读 · 0 评论 -
MurmurHash 哈希算法
MurmurHash:(multiply and rotate) and (multiply and rotate) Hash,乘法和旋转的hash 算法。一、哈希函数定义散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes)的指纹。散列值通常用一个短的随机字母和数字组成的原创 2021-08-14 16:50:29 · 4966 阅读 · 1 评论 -
布隆过滤器(Bloom Filter)
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。...原创 2021-06-03 17:26:16 · 1982 阅读 · 0 评论 -
Java实现雪花算法
SnowFlake是Twitter公司采用的一种算法,目的是在分布式系统中产生全局唯一且趋势递增的ID。 1bit,不用,因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用整数,所以最高位固定为0。 41bit-时间戳,用来记录时间戳,毫秒级。 - 41位可以表示个数字, - 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 ,减1是因为可表示的数值范围是从0开始算的,而不是1。 - 也就是说41位可以表示个毫秒的值,转化成单位年...原创 2021-04-02 19:22:48 · 272 阅读 · 0 评论 -
jdk8 获取上一周、下一周的周几
/** * 获取上周的周几 * * @param day 周几 1-周一...7-周日 * @return yyyy-MM-dd */ public static String getPreviousDay(int day) { //获取今天日期 LocalDate now = LocalDate.now(); //获取上周的今天 LocalDate minusDays = ...原创 2020-11-04 17:48:19 · 1037 阅读 · 0 评论 -
Java8 Optional判空 代码Demo
1.使用Optional 进行list集合的判空: List<Object> list = null; List<String> result = Optional.ofNullable(list) .map(objects -> objects.stream().map(Object::toString).collect(Collectors.toList()))//list不为null时的处理解析原创 2020-08-21 14:58:46 · 1254 阅读 · 0 评论 -
JDK8 ConcurrentHashMap源码笔记
理解了jdk1.8 HashMap的源码再来理解ConcurrentHashMap事半功倍,HashMap传送门:https://blog.csdn.net/yzh_1346983557/article/details/105456563一、ConcurrentHashMap的数据结构图图来源百度图片:可发现ConcurrentHashMap的数据结构和jdk1.8的HashMap...原创 2020-04-14 12:08:26 · 306 阅读 · 0 评论 -
LinkedHashMap源码笔记(jdk8)
jdk1.7是在构造函数中调用init()方法,init()中直接new Entry()创建了一个空节点对象作为双向链表的初始节点。LinkedHashMap extends HashMap implements Map,可发现LinkedHashMap相比较HashMap多维护了2个成员变量head、tail,这2个变量就是LinkedHashMap用来实现双向链表的。也是比HashMap.Node多维护了2个成员变量before、after,用于双向链表的连接。原创 2020-04-13 11:34:12 · 188 阅读 · 0 评论 -
JDK8 HashMap源码笔记
个人看源码的笔记记录,基于JDK1.8。一、HashMap的成员变量 //table数组默认初始化容量16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 //table数组最大容量2^ 30 次方 static final int MAXIMUM_CAPACITY = ...原创 2020-04-11 18:56:41 · 229 阅读 · 0 评论 -
Java常用设计模式简易代码Demo:单例、工厂、代理、模板、观察者、适配器、策略、装饰者
一、单例模式节省内存。public class SingleMode { private static volatile SingleMode singleMode = null;//懒汉式 private SingleMode() { } public static SingleMode getInstance() { if (singl...原创 2020-04-08 11:51:02 · 390 阅读 · 0 评论 -
ABC三线程顺序执行
一、Lock锁加Condition实现(推荐)LockABC:class RunMain { public static void main(String[] args) { LockABC lockABC = new LockABC(); new Thread(new Runnable() { @Override ...原创 2020-04-03 11:14:24 · 650 阅读 · 1 评论 -
ThreadLocal原理与使用场景
一、ThreadLocal原理如果看懂了ThreadLocal的set()方法,get()、remove()方法也就好理解了,所以重点看一下set()方法。set()方法执行流程总结:1.获取当前线程对象2.获取当前线程对象的成员变量ThreadLocalMap3.1不为null,set值3.1.1获取当前ThreadLocalMap对象的Entry数组3.1.2获取T...原创 2020-04-02 19:52:19 · 440 阅读 · 0 评论 -
volatile无法保证共享变量i++线程安全原因(JVM字节码层面)
一、i++先看一下局部变量i++执行流程与原理。javap -c -l Demo.class对class字节码文件进行反编译生成汇编代码(只列出我们关心的代码):javap -v 不仅会输出行号、本地变量表信息、反编译汇编代码,还会输出当前类用到的常量池等信息。javap -l 会输出行号和本地变量表信息。javap -c 会对当前class字节码进行反编译生成汇编代码。pu...原创 2020-03-31 19:54:27 · 612 阅读 · 0 评论 -
ReentrantLock Condition 随笔
Condition作用和Object.wait()和Object.notify()方法作用类似,但是wait()和notify()是和synchronized关键字结合使用的,而Condition是和ReentrantLock(重入锁)相关联的且更灵活:一个锁实例,可以绑定多个Condition实例,实现多路通知;notify()方法进行通知时,是随机进行选择的,但重入锁结合Condition对象...原创 2020-03-23 19:26:17 · 207 阅读 · 0 评论 -
自定义AQS同步器:互斥锁
自定义互斥锁:参考jdk的ReentrantLock可重入锁源码,定义一个互斥锁:import org.jetbrains.annotations.NotNull;import java.io.Serializable;import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.AbstractQ...原创 2020-03-21 17:21:49 · 265 阅读 · 0 评论 -
java的定时任务ScheduledExecutorService
ScheduledExecutorService service = Executors.newScheduledThreadPool(10); // 从现在开始1秒钟之后,每隔1秒钟执行一次job1 service.scheduleAtFixedRate(new Runnable(){..}, 1, 1, TimeUnit.SE...原创 2019-05-08 18:03:19 · 585 阅读 · 0 评论 -
CountDownLatch使用Demo
《Effective Java》书中对CountDownLatch的描述:倒计数(倒计时顺口些)锁是一次性的障碍,允许一个或多个线程等待一个或多个其它线程来做其它事情。CountDownLatch的唯一构造器带有一个int类型的参数,这个int参数是指允许所有在等待的线程被处理之前,必须在倒计时锁上调用countDown()方法的次数。import org.junit.Test;impo...原创 2019-03-28 11:26:57 · 255 阅读 · 0 评论 -
Java生成随机字符串
public class MyStringUtil { /** * 生成随机字符串 * * @param stringLength:生成的字符串长度 * @return */ public static String getRandomString(int stringLength) { String strin...原创 2019-01-07 17:17:23 · 5305 阅读 · 0 评论