java碎片收集
hashcon
做自媒体技术分享很久了,大家的抬爱与支持让我很开心很感激,但是个人本来做这些也并不是为了收益,只是为了个人学习与传播知识帮助更多的人,所以我将全网所有账号全部收益,持续捐给各种公益项目,也算不辜负大家的抬爱,也是回报祖国对我的一番培养。
曾任职于顺丰,华为,网易等公司,从Java小白,成长为资深开发与项目组首席架构师。喜欢源码与开源,曾贡献 MyCat1.6 核心源码,贡献过druid,Spring Cloud,dubbox,Apache RocketMQ,Apache Bookeeper 等多开源项目。
展开
-
Java中对于位运算的优化以及运用与思考
引言随着JDK的发展以及JIT的不断优化,我们很多时候都可以写读起来易读但是看上去性能不高的代码了,编译器会帮我们优化代码。之前大学里面学单片机的时候,由于内存以及处理器性能都极其有限(可能很多时候考虑内存的限制优先于处理器),所以很多时候,利用位运算来节约空间或者提高性能,那么这些优秀的思想,放到目前的Java中,是否还有必要这么做呢?我们逐一思考与验证下(其实这也是一个关于Premature...原创 2020-01-08 19:02:10 · 729 阅读 · 4 评论 -
由一次不断GC并耗费过长的时间所想到的工具 - jvmkill与jvmquake
最近发现线上的某个查询微服务,发生了一个奇怪的问题,GC次数突然变多,GC的时间耗费也变多。并不是一直有这个问题,而是每隔一段时间就会报出来的。查看jstat -gcutils 10000:有类似于如下的:S0 S1 E O M CCS YGC YGCT FGC FGCT GCT0.00 100.00 100.0...原创 2019-11-25 17:35:30 · 848 阅读 · 3 评论 -
结合CompletableFuture与Spring的Sleuth结合工具类与allOf以及anyOf
系列目录:Spring WebFlux运用中的思考与对比CompletableFuture与Spring的Sleuth结合工具类CommpetableFuture使用anyOf过程中的一些优化思考结合CompletableFuture与Spring的Sleuth结合工具类与allOf以及anyOf之前实现的CompletableFutureWithSpan,不能直接使用anyOf或者...原创 2019-11-22 17:06:38 · 17614 阅读 · 0 评论 -
CommpetableFuture使用anyOf过程中的一些优化思考
CompetableFuture的上一篇我们讲述了如何将CompletableFuture与Spring Sleuth结合起来。这篇我们继续优化CompletableFuture。CompletableFuture的allOf首先我们看看allOf的定义:public static CompletableFuture<Void> allOf(CompletableFuture&...原创 2019-11-18 20:22:05 · 12044 阅读 · 1 评论 -
从JDK8升级到JDK11,看这篇就足够了
原文地址:https://blog.codefx.org/java/java-11-migration-guide/。 在原文的基础上,增加了一些我遇到的具体的坑还有在特定场景下的解决方案,供大家参考一些背景在背景知识,我们会讨论一些关于新的JDK Release周期,OpenJDK特性归一化,LTS(Long-term support长期支持版本)的事情。1. 新的发布周期这个就可以...原创 2019-10-17 15:47:27 · 24945 阅读 · 2 评论 -
Lambda表达式最佳实践(3)Collector
在上一节Stream中提到了Collect方法其实已经说了很多关于Collector的事情,我们这里总结下Collector的一些用法。Collector一般用于Stream工作流的最后一步的收集。一些常用的方法1. Collectors.toList()用ArrayList收集ListString> givenList = Arrays.asList("a", "bb",原创 2018-02-06 19:36:00 · 5320 阅读 · 0 评论 -
Java 读取文件
JAVA有多种读取文件的方式,其中比较深层次的原理在我的另外一篇文章分析过:JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析,那么,我们有哪些方式去读取一个文件的内容呢?1. 从ClassPath中读取文件直接从项目的classpath(maven的话src/main/resource编译之后也会存在于classpath下)读取:InputStream inputS...原创 2018-12-03 14:19:46 · 1682 阅读 · 0 评论 -
Java获取HttpServletRequest真实的调用ip
有时候我们需要获取Http请求的源IP,但由于有着各种代理,与反向代理,还有代理请求头标准的缺失,导致我们想拿到真正的ip变得更加困难。这篇文章来总结下一个目前可行的比较全面的通用方法。首先,真实调用的ip,应该不是内网ip,并且考虑到客户端多样性,我们从通用的Header出发,并也考虑各种常见客户端的自定义Header。验证IP有效有效ip范围是,1.0.0.0~255.255.255.2...原创 2019-08-29 18:29:21 · 3110 阅读 · 0 评论 -
Java Map运用的思考与Funtional Interface联想
最近看到了一篇好文章:Map best practices - http://blog.tremblay.pro/2019/08/map.html虽然内容精简,但是思路确实很赞。假设我们有一个Map<String,List<String>>的Map,我们想实现分组,一般思路是先看这个key是否存在,不存在的话,就新建一个List并放入,存在就返回这个List。一...原创 2019-09-02 17:24:03 · 195 阅读 · 0 评论 -
Java8之后的业务取值避免空指针的一种解法
写业务代码的时候,通常会遇到数据库POJO对象转换为前端需要的VO对象,这时经常会遇到烦人的空指针问题,Java 8之前,我们可能这么写:对于对象field复制风格:a.setCreateTime(b.getCreateTime().getTime());a.setAmount(b.getPayed()+b.getVoucher());对于装饰器风格:public Long g...原创 2019-09-03 11:44:28 · 847 阅读 · 0 评论 -
从OpenJDK8到OpenJDK11 - StackWalker类
本文基于OpenJDK 11之前升级了JDK到OpenJDK11,把遇到的问题以及解决方案列一下。每篇文章会以提出问题,思路说明,解决问题的思路去行文。这篇文章是关于堆栈信息获取的。遇到的问题 - 调用堆栈获取之前有做调用堆栈监控上报,某些仅采集调用类,某些需要采集调用方法,总体来说:在Java8中,我们可以这样去获取调用堆栈:通过Reflection类:private st...原创 2019-09-10 19:57:28 · 6458 阅读 · 0 评论 -
OpenJDK8升级到OpenJDK11需要注意的修改与异常
目前,JDK两个长期版本是8和11,由于大部分项目使用的还是8,所以从8升级到11会遇到一些困难。本篇文章会基于实践遇到的问题,分类总结可能1. Java模块化从Java 9开始,由于引入了JPMS(https://openjdk.java.net/projects/jigsaw/spec/),开始更精细化的包管理和模块复用,导致很多JDK默认加载的包被移除了。其中我们可能会碰到的例如:...原创 2019-09-11 12:26:23 · 15765 阅读 · 1 评论 -
Lambda表达式最佳实践(2)Stream与ParallelStream
Stream是Java8新引入的API,有着广泛的运用创建一个StreamStream创建之后,就不能修改创建一个空的StreamStreamString> streamEmpty = Stream.empty();一般的,我们用如下这种写法避免空指针异常public StreamString> streamOf(ListString> list) {原创 2018-02-01 14:57:48 · 15134 阅读 · 1 评论 -
Lambda表达式最佳实践(1)入门与介绍
Java8引入了Lambda表达式特性,这些是通过java.util.function这个包实现的。所有的Lambda表达式都是这个包下的其中一类。我们来看下这个包java.util.function:可以看到很多有@FunctionalInterFace的接口,@FunctionalInterFace代表这个接口只有一个抽象方法。从命名,我们可以猜测出一些接口的作用。比如,Pre原创 2018-01-16 16:31:30 · 4178 阅读 · 0 评论 -
log4J配置
log4j.properties 的使用详解1. 输出级别的种类ERROR、WARN、INFO、DEBUG ERROR 为严重错误 主要是程序的错误 WARN 为一般警告,比如session丢失 INFO 为一般要显示的信息,比如登录登出 DEBUG 为程序的调试信息2. 配置日志信息输出目的地log4j.appender.appenderName = 1.org.apache.log4原创 2016-09-01 10:15:17 · 4971 阅读 · 0 评论 -
JDK核心JAVA源码解析(1) - Object
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。 首先我们从所有类的父类Object开始:1. Object类(1)hashCode方法和equals方法public native int hashCode();public boolea原创 2017-04-09 15:11:50 · 18027 阅读 · 6 评论 -
Fastxml 简单常用注解学习笔记
Fastxml 简单常用注解学习笔记@JsonNaming@JsonIgnoreProperties@JsonIgnore@JsonFormat@JsonDeserialize@JsonSerialize@JsonProperty如下User类package com.usoft;import com.fasterxml.jackson.annotation.JsonFormat;import转载 2017-05-14 09:21:22 · 7233 阅读 · 0 评论 -
Java异常收集
object is not an instance of declaring class报错: object is not an instance of declaring class 说明Class没有实例化; 解决办法: 由于没有实例化可以有如下两种方法: 1、反射方法定义成为static的,故被反射类就不需要实例化; 2、method.invoke(_class.new原创 2016-07-07 10:43:03 · 5502 阅读 · 0 评论 -
Java类收集
StringTokenizer: 字符串分割类:public class TestALL { public static void main(String[] args) { System.out.println("默认以空格,\\t,\\r,\\n分割"); StringTokenizer st = new StringTokenizer("www oo原创 2016-07-20 10:08:38 · 6043 阅读 · 0 评论 -
【转】J.U.C之阻塞队列:LinkedTransferQueue
原文出处http://cmsblogs.com/ 『chenssy』前面提到的各种BlockingQueue对读或者写都是锁上整个队列,在并发量大的时候,各种锁是比较耗资源和耗时间的,而前面的SynchronousQueue虽然不会锁住整个队列,但它是一个没有容量的“队列”,那么有没有这样一种队列,它即可以像其他的BlockingQueue一样有容量又可以像SynchronousQueue一样不会转载 2017-10-02 07:41:35 · 4144 阅读 · 0 评论 -
【转】jvm系列(一):java类的加载机制
1、什么是类的加载类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的 Class对象, Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加载器并不需要等到某个类被“首次主动使用”时转载 2017-10-11 22:23:55 · 4072 阅读 · 0 评论 -
Spring @Conditional相关
最本质的需求是根据条件加载Bean。 Spring4 提供了实现方案 — @Conditional ,可以通过条件判断创建 Bean 。示例:// java config@Configurationpublic class TestBeanConfig { // 根据条件创建, 条件写在TestConditional类里 @Bean @Conditional(TestCon原创 2017-12-21 21:27:24 · 4129 阅读 · 0 评论 -
Java NIO2包WatchService解析与运用
背景我们在用IDE写代码,或者某些文本编辑器的时候,在外部如果修改了这个文件,通常这些编辑器都能感知到,有些还会提示你是否要重新加载,例如notepad++: 这些特性都是基于文件系统的文件变化通知实现的。我们可以通过一些方式监控某些文件或者文件夹的变化,但是很难做到ScalableJava7之后的NIO2包的WatchService提供了一种Scalable的方式监控文件与文件夹变化代码解析pu原创 2018-01-02 16:54:38 · 5718 阅读 · 0 评论 -
异常堆栈转为String以及运行时获取调用栈
纯Java实现public class ExceptionUtils { public static String getStackTrace(Exception e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printSta原创 2018-01-02 20:40:10 · 6571 阅读 · 3 评论 -
Log4j2一些tips与最佳实践
Log4j2相对于log4j来说扩展了多种接口,并重新定义了日志记录流程,并且引入了一些框架例如Disruptor来加速。Log4j2无论在日志记录上,还有效率速率上都相对于log4j有很大的进步,下面我们来看一些比较有意思的使用和配置的最佳实践。使用Tip1.方法参数使用Java8 lambda表达式:在java8之前,有时候log日志的参数是某个方法,可能很耗时,为了提高性原创 2018-01-15 18:23:33 · 14093 阅读 · 0 评论 -
Java Unsafe 类
Unsafe类是啥?Java最初被设计为一种安全的受控环境。尽管如此,Java HotSpot还是包含了一个“后门”,提供了一些可以直接操控内存和线程的低层次操作。这个后门类——sun.misc.Unsafe——被JDK广泛用于自己的包中,如java.nio和java.util.concurrent。但是丝毫不建议在生产环境中使用这个后门。因为这个API十分不安全、不轻便、而且不稳定。这个不安全的类原创 2016-07-23 15:45:49 · 12773 阅读 · 1 评论