java
文章平均质量分 63
java相关分享
PolarisHuster
java程序员,爱编程爱运动,也喜欢结交朋友
展开
-
ScheduledExecutorService scheduleAtFixedRate抛出异常后定时任务不会再执行源码分析
ScheduledExecutorService scheduleAtFixedRate抛出异常后定时任务不会再执行源码分析原创 2024-04-16 10:48:12 · 338 阅读 · 0 评论 -
Protobuf3简单使用
Protobuf3简单使用转载 2022-12-01 09:00:42 · 903 阅读 · 0 评论 -
maven-checkstyle-plugin中文乱码
maven-checkstyle-plugin可以用来检测项目编码是否规范,且这个插件是有国际化支持的,但是这个插件在windows输出信息却会出现中文乱码问题,之所以出现这个问题是由于cmd的编码规则问题,可以通过命令chcp命令查看当前的cmd窗口编码规则,默认的为936即gbk编码,执行下chcp 65001命令修改编码为utf-8格式即可。编码调整前截图:编码调整后截图:...原创 2021-12-21 16:14:16 · 2659 阅读 · 0 评论 -
java代码规范之MethodName
俗话说无规矩不成方圆,写代码也是这样,如果没有一定的规范去约束,那么写出来的代码风格肯定千差万别,开源项目一般都会有自己的代码规范,不管是skywalking项目,还是nacos项目都有,好了废话不多说了,进入本文的正题:MethodName,这是maven checkstyle插件对方法名称的校验。 <module name="TreeWalker"> <!-- 方法名的校验 --> <module name="Me...原创 2021-12-20 15:11:03 · 1046 阅读 · 0 评论 -
高性能队列——Disruptor
背景Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。目前,包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disruptor以获取高性能。在转载 2021-05-08 16:05:36 · 367 阅读 · 0 评论 -
java stream distinct源码分析
首先看下两个简短的代码:代码1:@Testpublic void stringTest(){ List<String> list = new ArrayList<>(); list.add(new String("hello")); list.add("world"); list.add("hello"); list.stream().distinct().forEach(System.out::println);}输出结果:.原创 2020-08-15 20:49:17 · 2841 阅读 · 3 评论 -
下载jdk历史版本
进入oracle jdk下载页面https://www.oracle.com/java/technologies/javase-downloads.html,展示的是官网推荐版本下载路径:下载历史版本在该页下面一个不起眼的地方:或者直接去下面的网址下载也可以:https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html...原创 2020-07-31 14:33:24 · 321 阅读 · 0 评论 -
-XX:+PerfDisableSharedMem导致jps查不到java进程问题
笔者最近在使用开源物联网框架thingsboard时,发现docker内部的java进程通过jps命令查不到,凡是通过jps能查到的java进程,以linux系统为例都会在/tmp/hsperfdata_当前用户/(如/tmp/hsperfdata_root/)目录下创建以java进程id命名的文件,最终排查是因为thingsboard启动时传入了-XX:+PerfDisableSharedMem这个jvm参数导致,jvm参数里面有以下参数控制着该文件java -XX:+PrintFlagsFinal原创 2020-07-07 14:29:54 · 1208 阅读 · 0 评论 -
内存屏障保证缓存一致性
在前面内存系统重排序提到,*“写缓存没有及时刷新到内存,导致不同处理器缓存的值不一样”*,出现这种情况是糟糕的,所幸处理器遵循**缓存一致性协议**能够保证足够的可见性又不过多的损失性能。 缓存一致性协议给缓存行(通常为64字节)定义了个状态:独占(exclusive)、共享(share)、修改(modified)、失效(invalid),用来描述该缓存行是否被多处理器共享、是否修改。所以缓存一致性协议也称MESI协议。独占(exclusive):仅当前处理器拥有该缓存行,并且没有修改过,是...转载 2020-05-09 21:51:06 · 441 阅读 · 0 评论 -
jstat -gcnew命令详解
jstat全称Java Virtual Machine Statistics Monitoring Tool,是随jdk发布的一款用于输出jvm统计参数的命令行工具,用过jvisualvm的肯定会说有了jvisualvm为什么还需要用jstat命令行呢,jstat虽然可视化效果差些,但其在实际生产环境用起来却很方便,一般线上环境不会打开jmxremote功能,这样jvisualvm就无用武之地。...原创 2020-05-05 10:33:52 · 3864 阅读 · 4 评论 -
35个可以提高千倍效率的Java代码小技巧
01前沿代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,...转载 2020-04-25 15:44:09 · 351 阅读 · 0 评论 -
线程安全的恶汉单例实现
前言网上说单例模式是所有模式中最简单的一种模式,巧的是我也这么认为。不过越简单的东西,往往坑就隐藏的越深,这边文章我会把我知道的几个坑所出来。一.什么是单例模式就如同他的名字一样,'单例'-就是只有一个实例。也就是说一个类在全局中最多只有一个实例存在,不能在多了,在多就不叫单例模式了。1.白话小故事程序员小H单身已久,每天不是对着电脑,就是抱着手机这样来维持生活。某日,坐在电脑...转载 2020-04-25 15:40:57 · 681 阅读 · 0 评论 -
Java HotSpot VM参数大全
jvm调优是每个java程序员几乎绕不开的话题,本文就把jvm常用的一些命令参数记录下,方便以后使用,也希望能帮助到有需要的朋友。因为本文内容来自oracle官网,更多的信息可以参考oracle官网。行为参数:Option and Default Value Description -XX:-AllowUserSignalHandlers Do not complain i...原创 2020-04-04 18:05:48 · 488 阅读 · 0 评论 -
为什么文件占用空间跟文件大小不一样
本文拿windows系统举例,先看几张图: 图1 文件大小比占用空间小 图2 文件大小跟占用空间大小一致 图3 文件大小比占用空间大(而且相差较大)上面3张图展示了文件大小与占用空间的大小几种情况,前两种场景是比较常见的情况,之所以有时文件大小会比占用空间小...原创 2020-04-02 09:14:21 · 8526 阅读 · 0 评论 -
FileChannel map(MapMode mode, long position, long size)
我们可以通过FileChannel.map(MapMode mode, long position, long size)将文件通过关联的文件映射到内存区域,然后就可以通过MappedByteBuffer的相关读写方法直接操作对应文件,接下来看下下面的代码:@Test public void map1() throws IOException { RandomAc...原创 2020-04-01 09:16:53 · 1400 阅读 · 1 评论 -
如果使用FileChannel.transferTo等方法获取的数据看似比传入的长度短时
首先看下这个方法的定义:public abstract long transferTo(long position, long count, WritableByteChannel target) throws IOException该方法可以将一个输入性FileChannel的数据传输到一个WritableByte...原创 2020-03-28 14:05:36 · 996 阅读 · 0 评论 -
关于NIO与Socket编程技术指南 “验证 write(ByteBuffer src, long position)方法中的 position 不变性”的不严谨问题
NIO与Socket编程技术指南2018.7版中第 2 章通道和 FileChannel 类的使用(第130页)关于“验证 write(ByteBuffer src, long position)方法中的 position 不变性的”不够严谨,首先贴出该书中的示例代码,file.txt中笔者存了123。@Test public void writeAtPos()throws IOEx...原创 2020-03-28 11:13:17 · 444 阅读 · 1 评论 -
追加模式创建的FileOutputStream获取的FileChannel设置position不影响写入位置
下面看段代码:@Test public void append(){ DateTimeFormatter df = DateTimeFormatter.ofPattern("HH:mm"); try { //追加模式创建FileOutputStream FileOutputStream fos = new FileOutputStream("d:/tm...原创 2020-03-26 13:45:36 · 1694 阅读 · 0 评论 -
hashmap为什么查询时间复杂度为O(1)
Hashmap是java里面一种类字典式数据结构类,能达到O(1)级别的查询复杂度,那么到底是什么保证了这一特性呢,这个就要从hashmap的底层存储结构说起,下来看一张图:上面就是hashmap的底层存储示意图,要想查看一个键值对应的值,首先根据该键值的hash值找到该键的hash桶位置,即是tab[2]还是tab[1]等,计算某个键对应的哈希桶位置很简单,就是int pos = (...原创 2020-03-08 12:59:58 · 18651 阅读 · 11 评论 -
Lombok工作原理
相信大家在项目中都使用过Lombok,因为能够简化我们许多的代码,但是该有的功能一点也不少。那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立getter和setter方法啊,构造函数啊之类的,lombok的作用就是为了省...转载 2020-03-01 11:38:32 · 1142 阅读 · 0 评论 -
Java深拷贝和浅拷贝
定义浅拷贝基本数据类型 拷贝数值 引用类型 拷贝对象引用深拷贝基本数据类型 拷贝数值 引用类型 拷贝引用所对应对象的所有数值浅拷贝实现方式1. 拷贝构造方法拷贝构造方法指的是该类的构造方法参数为该类的对象。使用拷贝构造方法可以很好地完成浅拷贝,直接通过一个现有的对象创建出与该对象属性相同的新的对象。实现如下(PS:已略去部分代码):浅拷贝-拷贝构造...转载 2020-02-27 18:53:48 · 254 阅读 · 0 评论 -
String.format格式化枚举对象
java中String.format可以使用%s来格式化枚举类,不管是下面的简单枚举类,还是复杂的枚举类:public enum VertexColor { WHITE,GRAY,BLACK;}//复杂些的枚举类public enum Color{ BLACK("黑色",1), WHITE("白色",2); private String desc; private...原创 2020-02-23 17:48:03 · 1124 阅读 · 0 评论 -
详解springboot通过spi机制加载mysql驱动过程
DataSourceProperties这个类是springboot用来配置数据库的一个基础配置类,该类定义如下:@ConfigurationProperties(prefix = "spring.datasource")public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {...原创 2020-02-21 21:33:49 · 2983 阅读 · 0 评论 -
使用try-with-resource需要注意的地方
try-with-resource是JDK7引入的语法糖,可以简化Autocloseable资源类的关闭过程,比如JDK7以前下面的代码: File file = new File("d:/tmp/1.txt"); FileInputStream fis = null; try { fis = new FileInputStream(file); xxxxx ...原创 2020-02-17 18:15:05 · 3072 阅读 · 1 评论 -
java将图片按照原尺寸比例存入word中
在使用poi往word里面插入图片时可以使用XWPFParagraph.insertNewRun(i).addPicture(InputStream pictureData, int pictureType, String filename, int width, int height)方法但是为了使得插入word中的图片按照原图尺寸进行等比例缩放,我们必须必须获得原图的尺寸,常用的方法...原创 2020-02-17 12:34:31 · 2781 阅读 · 0 评论 -
IDEA最好用插件推荐
推荐使用idea,现在有了免费的community版本,功能上比付费版本少些,但是使用起来要比eclipse强太多1 背景俗话说:“工欲善其事必先利其器”,本问介绍几款强大实用的 IDEA 插件,助力大家开发。希望大家做一个聪明又努力的人,而不只是一个努力的人。以下插件大都可以通过IDEA自带的插件管理中心安装,如果搜不到可以去 IDEA 插件官网下载本地导入。...转载 2020-01-11 13:42:26 · 1392 阅读 · 0 评论 -
Java日志体系
Java日志体系居然这么复杂?——架构篇日志到底是何方神圣?为什么要使用日志?想必大家都有过使用System.out来进行输出调试,开发开发环境下这样做当然很方便,但是线上这样做就有麻烦了:系统一直运行,输出越来越多,磁盘空间逐渐被写满 不同的业务想要把日志输出在不同的位置 有些场合为了更高性能,尽量控制减少日志输出,需要动态调整日志输出量 自动输出日志相关信息,比如:日期、...转载 2020-01-06 08:41:19 · 189 阅读 · 0 评论 -
不要在并发场景下使用hashmap的原因
相信很多人都知道jdk7及其以前版本的hashmap在并发场景下使用时存在死循环(注意是死循环,不是死锁)的问题,问题出在扩容时对链表逆序的问题,下面是出问题的相关源码: /** * Transfers all entries from current table to newTable. */ void transfer(Entry[] newTab...原创 2019-12-25 08:59:11 · 821 阅读 · 1 评论 -
sun.misc.Hashing cannot be resolved to a type
sun.*包内的类在开发时尽量不要使用,oracle在官网上也建议大家不要使用,可以参考https://www.oracle.com/java/technologies/faq-sun-packages.html,像eclipse之类的编译器也会对引用sun.*子包内的类给出编译错误,要想使用必须相应设置可以绕过这一限制,但是这却不是一个好的开发习惯,sun.*子包内的类很可能会在后续版本中移除,...原创 2019-12-11 14:22:36 · 876 阅读 · 0 评论 -
缓存一致性协议(MESI)
笔者在学习过程中发现了一个不错的网站,模拟了MESI协议流程,现分享下:https://www.scss.tcd.ie/Jeremy.Jones/vivio/caches/MESI.htm运行效果图如下所示:上图是CPU0、CPU1两个核心分别执行a0++后的效果图,执行顺序是CPU1执行a0++操作,然后CPU0执行a0++操作,我们可以看出CPU0根CPU1中a0副本变量的...原创 2019-12-03 14:59:21 · 855 阅读 · 3 评论 -
为什么junit单元测试会关闭非守护进程
在网上有不少人发现了这个问题,却没有说明这个问题背后的故事,今天笔者就从源头把这个问题解释下,先把demo程序中用到的两个类代码贴出来:消费者类public class Consumer implements Runnable{ private final TransferQueue<String> queue; public Consumer(TransferQueue...原创 2019-11-26 16:07:22 · 726 阅读 · 0 评论 -
使用ScheduledExecutorService执行周期性任务需要注意的地方
使用spring框架开发程序时基本上很少有人会使用ScheduledExecutorService来执行周期性任务,但是ScheduledExecutorService在某些场景下可能会用到,使用JDK自带的这个周期性调度器时一定要确保任务内部不能抛出运行时异常,否则后续任务将不会执行,至于原因,接下来将从源码角度分析下:使用Excutors工厂类创建的ScheduledExecutorSer...原创 2019-11-18 14:28:22 · 1360 阅读 · 0 评论 -
Treiber Stack简单分析
AbstractTreiber Stack Algorithm是一个可扩展的无锁栈,利用细粒度的并发原语CAS来实现的,Treiber Stack在 R. Kent Treiber在1986年的论文Systems Programming: Coping with Parallelism中首次出现。基本原理该算法的基本原理是:只有当您知道要添加的项目是自开始操作以来唯一添加的项目时,才会...转载 2019-11-16 17:31:38 · 367 阅读 · 0 评论 -
java调试体系之Java 调试接口(JDI)
JDI 简介JDI(Java Debug Interface)是 JPDA 三层模块中最高层的接口,定义了调试器(Debugger)所需要的一些调试接口。基于这些接口,调试器可以及时地了解目标虚拟机的状态,例如查看目标虚拟机上有哪些类和实例等。另外,调试者还可以控制目标虚拟机的执行,例如挂起和恢复目标虚拟机上的线程,设置断点等。目前,大多数的 JDI 实现都是通过 Java 语言编写的。比...转载 2019-11-06 11:10:27 · 2805 阅读 · 1 评论 -
java调试体系之JPDA 体系概览
JPDA 概述所有的程序员都会遇到 bug,对于运行态的错误,我们往往需要一些方法来观察和测试运行态中的环境。在 Java 程序中,最简单的,您是否尝试过使用System.out.println()来输出您的 Java 程序的执行中的各种变量状态来发现您的 Java 程序运行时的问题?这种方式方便易用,在一些简单的情况下能够解决您的问题,但是如果当您的程序运行在远程环境上,或者当前环境不允...转载 2019-11-06 11:05:13 · 839 阅读 · 0 评论 -
ThreadPoolExcutor中的shutdownPerm运行时权限
ThreadPoolExcutor中的shutdownPerm运行时权限属性,该属性定义如下:private static final RuntimePermission shutdownPerm = new RuntimePermission("modifyThread");在ThreadPoolExecutor类的shutdown方法时会校验调用者是否有关闭线程...原创 2019-11-06 09:09:53 · 530 阅读 · 0 评论 -
双亲委派模型详解
文章内容相对较长,但如果你希望对 Java 的类加载过程有个更深入的了解,同时增加自己的面试技能点,请耐心读完......双亲委派模型在介绍这个Java技术点之前,先试着思考以下几个问题: 为什么我们不能定义同名的String的 java 文件? 多线程的情况下,类的加载为什么不会出现重复加载的情况? 热部署的原理是什么? 下面代码,虚拟机是怎样...转载 2019-11-01 08:46:40 · 1467 阅读 · 3 评论 -
Implicit super constructor BaseService() is undefined. Must explicitly invoke another constructor
今天遇到了这个问题,也在网上查了不少资料,为什么还要写这篇文章呢,看完之后您也许就了解我的意图了直接上代码:public AckService(String name,DispatchThread dispatch) //显示这篇文章的标题错误信息,比较长省略{ this.dispatch = dispatch; super(name);原创 2015-08-25 15:39:09 · 4903 阅读 · 0 评论 -
Syntax error, type annotations are available only when source level is at least 1.8
今天在编程时遇到这个问题,于是在网上一顿搜索,但都没有解决我的这个问题,网上的解决方案大致如下:解决办法:Project->Properties->Java Compiler->Compiler Compliance Level选择5.0或者以上的jdk版本然并卵啊,也许能解决其他人碰到的问题,但是对我来说不适用,最终我了编译错误的第二行信息:Invalid escape se原创 2015-08-27 07:57:37 · 1762 阅读 · 0 评论 -
JVM内存管理:深入垃圾收集器与内存分配策略
概述: 说起垃圾收集(Garbage Collection,下文简称GC),大部分人都把这项技术当做Java语言的伴生产物。事实上GC的历史远远比Java来得久远,在1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期,人们就在思考GC需要完成的3件事情:哪些内存需要回收?什么时候回收?怎么样回收? 经过半个世纪的发展,目前的转载 2015-08-27 16:15:25 · 467 阅读 · 0 评论