
Java
loophome
这个作者很懒,什么都没留下…
展开
-
JAVA keytool工具使用,生成证书
keytool -genkeypair [OPTION]...keytool.exe -genkeypair -keysize 2048 -validity 365 -keyalg RSA -dname "CN=localhost" -keypass pass123 -storepass pass123 -keystore local.jks参考命令生成密钥对选项:-alias <alias> 要处理的条目的别名-keyalg <...原创 2021-07-20 10:50:37 · 630 阅读 · 0 评论 -
Comparators should be “Serializable“ (squid:S2063)
A non-serializable Comparator can prevent an otherwise-Serializable ordered collection from being serializable. Since the overhead to make a Comparator serializable is usually low, doing so can be considered good defensive programming.不可序列化的比较器可以防止可序列化的有原创 2021-07-12 16:36:05 · 478 阅读 · 0 评论 -
Netty服务端option配置SO_REUSEADDR
SO_REUSEADDR提供如下四个功能:SO_REUSEADDR允许启动一个监听服务器并捆绑一个端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在(TIME_WAIT)。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。 SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。 SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。 SO_RE原创 2021-07-08 18:29:31 · 1707 阅读 · 1 评论 -
解决springboot,单元测试启动ApplicationRunner问题
在执行单元测试时,ApplicationRunner被意外启动,导致了Netty服务器被初始化,单元测试无法执行的问题。解决方案:通过设置ApplicationRunner对应Bean的Profile解决对应组件添加注解:@Profile("!test")单元测试添加注解:@ActiveProfiles("test")...原创 2021-07-07 16:59:17 · 1869 阅读 · 2 评论 -
Java:base64处理
Java:base64处理包含3种,java.util.Base64已经集成在Java中,不需要额外引入新的包应用场景 Encoder Decoder 普通base64 Base64.getEncoder() Base64.getDecoder() RFC4648 URL安全(如果需要包含在URL中使用) Base64.getUrlEncoder() Base64.getUrlDecoder() RFC4648_URLSAFE 媒体类.原创 2021-01-21 21:32:45 · 455 阅读 · 0 评论 -
Java应用线程池配置例子
Java应用线程池配置例子一)使用Executors工厂创建线程池Executors为我们提供默认的执行策略名称 说明 newSingleThreadExecutor 创建一个单线程的线程池。线程池使用无界队列,保证任务顺序执行。 newCachedThreadPool 创建一个线程池。该线程池根据需要创建新的线程,调用execute将重用已构造的线程,如果没有可用的线程,将会创建一个新的线程并加入到线程池中。默认60秒未使用的线程将被终止并从池中删除。 newFi原创 2020-09-01 11:42:40 · 294 阅读 · 0 评论 -
gradle plugin 400 bad request问题处理
现象,gradle无法加载任何插件,任何依赖包,即使设置了阿里云代理也不行。打开--stacktrace,发现所有请求均是400,但是用浏览器打开是可以加载的。解决方案:打开gradle的配置目录,一般位于用户目录的.gradle/gradle.properties移除下面4行即可systemProp.https.proxyPort=80systemProp.http.proxyHost=mirrors.neusoft.edu.cnsystemProp.https.proxyHost原创 2020-07-27 11:39:29 · 593 阅读 · 0 评论 -
Jackson反序列化json字符串到java对象对Object类型和抽象类处理
Jackson反序列化json字符串到java对象对Object类型和抽象类处理1)java对象的属性为Object,将会转化为LinkedHashMappublic class ObjectTest { private static final Logger logger = LoggerFactory.getLogger(ObjectTest.class); @Test public void objectTest() throws JsonProcessingException {原创 2020-07-24 14:03:48 · 1792 阅读 · 0 评论 -
Java:随机数生成Random和ThreadLocalRandom
Random和ThreadLocalRandom都能够生成随机数,以下2个例子都能生成0-99内的数据数RandomRandom的构造函数会生成一个随机数生成器。每次调用构造函数生成的随机数种子都不一样。nextInt方法:返回下一个均匀分布的伪随机整数,合计共2的32次方的整数值。ThreadLocalRandomThreadLocalRandom是线程相关的,调用ThreadLocalRandom.current()会返回当前线程的ThreadLocalRandom对象。Thread原创 2020-06-12 16:51:31 · 475 阅读 · 0 评论 -
Java:java.util.Map compute用法(compute,computeIfAbsent,computeIfPresent)
java.util.Map compute用于计算指定键映射的值(如果键没有映射时,值为null)。应用场景,向Map的键映射的字符串后连接新的字符串。map.compute(key, (k, v) -> (v == null) ? msg : v.concat(msg))如果函数返回空值,则移除映射(如果最初不存在映射,则保持不存在)。如果函数本身抛出异常,则该异常将被重新引发,并且当前映射保持不变。compute提供了3个方法方法 场景 compute 无论是否原创 2020-06-03 11:20:38 · 956 阅读 · 0 评论 -
Java:mysql-Date字段映射java.sql.Date日期偏差14个小时
Java:mysql-Date字段映射java.sql.Date日期偏差13个小时,估计是时区的问题。观察到Java程序日志的时间是正常的,因此怀疑mysql的时区问题。1)先检查mysql时区show variables like "%time_zone%";返回结果system_time_zone CST2)什么是CSTmysql在5.7版本默认的时区为.美国中部时间 Central Standard Time (USA) UTC-06:00,跟中国的UTC+08:00正好相差.原创 2020-05-25 11:07:38 · 527 阅读 · 0 评论 -
Java并发处理CountDownLatch应用
CountDownLatch概念一种同步辅助程序,允许一个或多个线程等待在其它线程中执行的一组操作完成。使用给定的计数初始化CountDownLatch。由于调用了倒计时方法,await方法将阻塞,直到当前计数达到零,然后释放所有等待线程,并立即返回await的任何后续调用。这是一个一次性现象——计数不能重置。如果需要重置计数的版本,请考虑使用CyclicBarrier。倒计时锁存器是一种通用的同步工具,可用于多种目的。使用计数1初始化的倒计时锁存器用作简单的开/关锁存器或门:调用倒计时的线程在原创 2020-05-18 17:11:23 · 339 阅读 · 0 评论 -
perf性能分析工具命令简单实用
perf性能分析工具命令简单实用参考资料:https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/原创 2020-04-01 17:39:49 · 1301 阅读 · 0 评论 -
Java:上传代码库导maven仓库mvn deploy命令
通过mvn命令部署maven package:打包到本项目,一般是在项目target目录下 maven install:打包会安装到本地仓库 maven deploy:将打包的文件发布到远程仓库(私服),提供其他人员进行下载依赖maven配置这个文件位于conf/setting.xml<servers> <server> <id...原创 2020-03-05 15:59:47 · 1472 阅读 · 0 评论 -
Java:CloseableHttpClient处理gzip接口没有释放连接问题
CloseableHttpClient使用了连接池,业务上遇到了org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool异常,这里显示连接池大小不够了。当时并发并不是很高,为什么遇到这个问题呢?后来发现接口使用了gzip压缩,如果对方关闭了gzip就没有问题。这里展...原创 2020-03-05 10:58:13 · 2078 阅读 · 2 评论 -
Java:google guava缓存存储原理分析
google guava缓存结构1)LocalCache.Segment(继承了可重入锁,有多少个Segment取决于设置的并发级别)2)java.util.concurrent.atomic.AtomicReferenceArray(第一层Java的原子对象数组,没有使用到CurrentHashMap),通过对key进行hash,决定数组的index3)ReferenceEntry<...原创 2020-02-28 10:59:06 · 811 阅读 · 0 评论 -
Java:google guava缓存穿透原理分析
google guava缓存穿透使用ReentrantLock(可重入锁)实现,当某个key在缓存中失效并执行回源,其他线程将会阻塞,直到回源完成。1)ReentrantLock管理LocalCache中包含内部类Segment,该类继承了ReentrantLockstatic class Segment<K, V> extends ReentrantLock {在...原创 2020-02-27 13:50:27 · 1208 阅读 · 0 评论 -
Java:orika-mapper对象深复制工具
Orika是一个Java Bean映射框架,它递归地将数据从一个对象复制到另一个对象。它在开发多层应用程序时非常有用。为什么要使用对象映射?Orika可以用来简化一个对象层和另一个对象层之间的映射过程,避免各种手动编写创建对象和复制属性的方法。Orika目标是构建一个全面、高效和健壮的Java bean映射解决方案。Orika专注于尽可能自动化,同时在需要时通过配置和扩展提供定制。...原创 2020-02-24 18:21:37 · 1449 阅读 · 0 评论 -
Java:spring Value注解用法详解
Value注解是字段或方法/构造函数参数级别的注释,用于分配参数的默认值表达式。我们可以使用@Value注释读取spring环境变量和系统变量。语法:@Value("Default DBConfiguration")private String defaultName;//Method@Value("Test")public void printValues(String s,...原创 2020-02-06 14:48:43 · 5481 阅读 · 0 评论 -
Java使用Builder模式构造实例
构建Java实例通常有几种方式,1)通过构造方法创建,2)通过JavaBeans模式的getter/setter构建。一般情况下这2种方式没有什么问题,但是当参数非常多的时候,就会不够友好。1)通过构造方法创建当成员非常多的时候,会导致构造函数参数非常多,甚至部分成员是可选的时候,将会导致多个构造方法,并且这些方法非常难理解。2)通过JavaBeans模式的getter/setter构...原创 2020-01-23 13:29:11 · 1394 阅读 · 0 评论 -
服务器上tomcat进程突然终止问题排查 - OOM Killer
服务器上tomcat进程突然终止问题排查1)检查是否shell进程终止导致tomcat终止(排除)由于使用./catalina.sh start启动tomcat,启动后tomcat的父PID为1,因此不会由于shell断开而终止2)tomcat进程是否被kill掉(排除)查询tomcat的catalina.out日志,未发现有终止的日志,比如INFO [Thread-6] or...原创 2020-01-16 21:00:08 · 4343 阅读 · 0 评论 -
Java8 Stream,List转Map遇到key冲突问题-java.lang.IllegalStateException: Duplicate key
在使用Stream把List转化为Map的时候,抛出了java.lang.IllegalStateException: Duplicate key异常,原因在于生成Map的key出现冲突。查看如下代码:当我们根据猫的名字创建名称Map的时候,发现有2个相同的cat2,导致了产生IllegalStateException异常package com.bytrees.test;impo...原创 2020-01-10 13:45:30 · 3028 阅读 · 0 评论 -
tomcat9开启远程调试功能
1)tomcat启动配置修改bin/setenv.sh文件导入如下变量export JPDA_ADDRESS=0.0.0.0:8000启动tomcat命令,启动完成后可以使用netstat命令查看8000端口的情况,如果端口被监听,则证明启动成功./catalina.sh jpda start2)配置Eclipse配置"Debug Configurations" =&...原创 2020-01-08 17:46:07 · 1373 阅读 · 0 评论 -
Java,使用不可改变集合-unmodifiable
Java,使用不可改变集合-unmodifiable适用于一些枚举集合的配置,例如部门数据,在应用整个生命周期,部门列表应该是不能变更的。import java.util.Collections;import java.util.HashMap;import java.util.Map;public enum DepartmentEnum { D1("D1", 1), ...原创 2020-01-08 11:15:47 · 557 阅读 · 0 评论 -
logback.xml配置导入spring无法启动:ch.qos.logback.core.joran.spi.JoranException: I/O error occurred while par
报错信息Caused by: java.lang.IllegalStateException: Could not initialize Logback logging from classpath:logback-spring.xml at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfigur...原创 2019-12-02 16:14:06 · 3580 阅读 · 0 评论 -
logback异步日志AsyncAppender配置
日志记录会消耗性能,但当出现问题的时候,日志又能够帮助我们快速解决问题。那么如何提高打日志的性能呢?在使用logback的时候,推荐使用AsyncAppender异步记录日志。1)logback设置AsyncAppender要注意AsyncAppender异步记录ILoggingEvents,它仅充当事件分派器,因此必须引用另一个appender才能执行任何有用的操作。<con...原创 2019-11-26 14:01:49 · 19337 阅读 · 1 评论 -
ImageIO.read(InputStream)返回null问题
ImageIO.read(InputStream)返回null问题问题背景在上传图片的时候,ImageIO.read(InputStream)能够正常读取图片,代码如下//org.springframework.web.multipart.MultipartFile uploadFileInputStream input = uploadFile.getInputStream();...原创 2019-10-23 14:50:05 · 10603 阅读 · 1 评论 -
Java多线程:Thread基础(一)
Java的多线程基于Thread,我们先看看Thread的继承关系public class Thread implements Runnable可以看到Thread基础了Runnable接口,Runnable接口仅仅有run方法,用于实现线程逻辑。启动线程-start方法启动线程需要调用start方法。备注,不要使用run方法,run方法仅仅是执行Runnable实例中的ru...原创 2019-08-02 18:17:06 · 191 阅读 · 0 评论 -
spring boot ControllerAdvice注释对filter抛出的异常不生效的问题解决
之前做了一个简单的登录验证,使用了Filter实现,返回内容是直接写死在Filter里面。今天为了统一返回,想通过抛出异常方式,使用ControllerAdvice进行返回。结果是不行的,ControllerAdvice无法获取到Filter的异常。原因:请求进来 会按照filter ->interceptor -> controllerAdvice -> as...原创 2019-07-05 11:47:29 · 4809 阅读 · 4 评论 -
Java Log4j和Log4j2的区别
Java Log4j和Log4j2的区别一、核心JAR包log4j核心包:log4j:log4j:[version]而log4j2的核心包有2个:org.apache.logging.log4j:log4j-core:[version]org.apache.logging.log4j:log4j-api:[version]二、配置文件log4j:通过一个log4j....原创 2019-06-28 19:01:56 · 18491 阅读 · 1 评论 -
shadowJar:archive contains more than 65535 entries.问题解决
在打fat-jar包的时候,如果包的文件数量大于65535 或者文件大小大于4G,会出现这个错误。这时,只需要添加zip64 true就可以解决shadowJar { dependencies { } zip64 true}参考链接:https://docs.gradle.org/5.0/dsl/org.gradle.api.tasks.bundling.Zip...原创 2019-06-28 17:00:15 · 4049 阅读 · 1 评论 -
maven常用命令记录
初始化工程命令mvn archetype:generate -DgroupId=com.bytrees -DartifactId=bytrees -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false备注:-DinteractiveMode=false 是否已交互模式进行,如果是false的话就会采用默...原创 2018-12-26 13:46:00 · 139 阅读 · 0 评论 -
Java并发编程 Synchronized及其实现原理
Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个1)确保线程互斥的访问同步代码。即保证了一个代码块在同一时间仅有一个线程可以执行。2)保证共享变量的修改能够及时可见,保证了原子性3)有效解决重排序问题怎么使用Synchronized1)普通同步方法,锁是当前实例对象public s...原创 2019-07-25 20:35:52 · 154 阅读 · 0 评论 -
Java并发编程 ReentrantLock可重入锁 - 防止缓存穿透
ReentrantLock是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与synchronized关键字相比,它更灵活、更强大,增加了轮询、超时、中断等高级功能。参考:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/locks/ReentrantLock.html可...原创 2019-07-26 11:28:43 · 540 阅读 · 0 评论 -
记一次tomcat程序CPU占用高排查-backgroundProcessorDelay参数
一个简单的spring-boot mvc服务放在tomcat中执行,虽然服务器配置比较低,但是访问量不大,一般没什么太大问题。服务部署后,即使没有任何访问量,每隔10s发生一次young gc,并且CPU使用率长期大于10%。明明没有访问量,到底发生什么?使用top -H -p查询繁忙线程首先,需要查询哪个线程占用CPU高,这里使用top命令,top -H -p [tomcat pid...原创 2019-09-10 11:33:23 · 4872 阅读 · 1 评论 -
Java:本地缓存之google guava cache使用
缓存在各种各样的系统中都非常有用。例如,当一个值的计算或检索成本很高时,您应该考虑使用缓存。缓存类似于ConcurrentMap,但不完全相同。最基本的区别是,ConcurrentMap将所有添加到其中的元素持久化,直到它们被显式删除。另一方面,缓存通常被配置为自动收回条目,以限制其内存占用。在某些情况下,LoadingCache可能很有用,即使它没有逐出条目,因为它是自动加载缓存的。适...原创 2019-09-10 18:31:52 · 2439 阅读 · 0 评论 -
Java:本地缓存之google guava cache 使用之数据清理
现实中,不可能把所有的数据全部放到内存中。您必须决定:什么时候不值得保留缓存条目?guava提供了三种基本类型的数据驱逐:基于缓存对象数量的驱逐、基于时间的驱逐和基于引用的驱逐。基于缓存对象数量的驱逐如果你的缓存对象数量不应该增长超过一定的大小,只需使用CacheBuilder.maximumSize(long)。缓存将尝试逐出没有被经常访问的数据。逐出操作会在对象数量接近限制的时候发生。...原创 2019-09-11 15:36:20 · 3616 阅读 · 0 评论 -
java-使用spring mvc输出图片
由于展示某些图片数据需要权限验证,因此不能直接访问图片资源。因此,使用spring mvc输出图片中遇到一个问题。刚开始使用以下方式返回图片的字节,然而发现response.setContentType("image/png");并没有生效,返回的Response中type是text,导致图片无法展示。@WebCheckLogin@GetMapping(value="/album/re...原创 2019-09-18 10:54:42 · 781 阅读 · 0 评论 -
解决使用BufferedImage内存溢出的问题OutOfMemoryError: Java heap space
业务上有一个缩放图片的操作使用了BufferedImage,但是经常发现生成图片失败。查看日志显示OutOfMemoryError: Java heap space,内存溢出错误。通过获取javahprof来分析,发现大部分内存被BufferedImage占用。难道生成缩略图后,没有自动释放?答案是的,当释放图片后,再没有发生过OutOfMemoryError。看看如下代码: /**...原创 2019-09-30 15:16:26 · 16678 阅读 · 15 评论 -
Java Eclipse Memory Analyzer(MAT)内存泄漏报告
Java Eclipse Memory Analyzer(MAT)内存泄漏报告一、通过jmap命令,获取目标程序的dump例子: jmap -dump:live,format=b,file=heap.bin <pid>二、打开Eclipse Memory Analyzer,导入dump下来的文件点击"File" => "Open heap dump"。导入完...原创 2019-07-03 14:33:42 · 958 阅读 · 0 评论