Java
文章平均质量分 54
sodawoods
LETSGETIT
展开
-
Java泛型的PECS原则
Java泛型的PECS原则原创 2022-06-07 21:54:03 · 862 阅读 · 0 评论 -
你知道jps命令是怎么工作的吗?
jps怎么突然不能用了?原创 2022-04-26 21:51:53 · 1705 阅读 · 0 评论 -
ScheduledThreadPoolExecutor源码分析
我们在ThreadPoolExecutor源码分析中分析了ThreadPoolExecutor的一些关键字段和方法,本文主要对ThreadPoolExecutor的子类ScheduledThreadPoolExecutor进行一些源码分析,本文基于JDK1.8.0_202。原创 2022-04-26 21:43:59 · 518 阅读 · 0 评论 -
ThreadPoolExecutor源码分析
线程池源码分析、ThreadPoolExecutor原创 2022-04-13 20:31:28 · 1018 阅读 · 0 评论 -
FutureTask源码分析
FutureTask源码分析原创 2022-04-09 14:41:50 · 1031 阅读 · 3 评论 -
处理IllegalAccessError
异常描述如下Caused by: java.lang.IllegalAccessError: tried to access method com.test.framework.replica.TopicUtil.get(Lcom/test/tool/AvailableZone;)Lcom/test/framework/replica/ReplicaTopicUtil$MostMatchIdc; from class com.test.framework.jedis.replica.JedisReplic原创 2021-07-20 21:10:48 · 3307 阅读 · 0 评论 -
Arthas使用方法记录
查看一个类是从哪个jar包加载的可以在启动java时加上-verbose:class参数,例如 java -verbose:class -classpath ‘./*’ xx.xx.Main使用Arthas的sc命令,sc -d org.apache.hadoop.hbase.client.Scan,从输出中的code-source中可以看到类是从哪个jar加载的。Java 可以使用 -classpath 参数指定依赖类所在位置。如果启动命令是java -classpath a.jar:b.jar原创 2021-05-18 12:02:29 · 1499 阅读 · 0 评论 -
Java堆过大导致的OOM问题排查和MAT的使用
获取Heap Profile文件线上服务出现问题,第一步做的一定是及时止损,然后再找原因和修复。对于Java服务,如果启动参数配置了-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/woods -Dfile.encoding=UTF-8那么在服务OOM时直接就可以在相应路径下就可以拿到heap dump的heap profile文件了。但是,如果启动服务时没有指定以上参数,例如只是指定了-XX:+ExitOnOutOfMemoryErr原创 2021-04-18 21:53:05 · 710 阅读 · 0 评论 -
curl请求MultipartHttpServletRequest
Web服务器允许用户利用multipart请求,将本地文件上传到服务器。SpringMVC通过对ServletAPI的HttpServletRequest接口进行扩展,从而实现文件上传。Spring提供的接口是org.springframework.web.multipart.MultipartRequest,通过MultipartRequest#getFile方法,可以获取到用户上传的文件。一段代码@PostMapping("/upload")@ResponseBodypublic String原创 2021-04-18 20:51:49 · 512 阅读 · 0 评论 -
Curl请求@RequestBody List
@RequestBody标注在List作为参数,请求方式curl -H “Content-type: application/json” -XPOST -d ‘[{“name”:“ThreeBody”, “id”:1}]’ “http://localhost:9111/test/path” @RequestMapping(value = "/test/path", method = RequestMethod.POST) public String insertBooks(@RequestB.原创 2021-03-10 16:32:45 · 1522 阅读 · 0 评论 -
算法常用技巧:字符串
字符串预处理-对于字符串s,判断i到j的子串是否是回文串 int len = s.length(); // s[i ~ j]是否为回文串,如果s[i] == s[j]并且isPalindrome[i + 1][j - 1]是true,那么isPalindrome[i][j]也是true boolean[][] isPalindrome = new boolean[len][len]; for (int i = 0; i < len; i++) {.原创 2021-03-07 21:33:44 · 68 阅读 · 0 评论 -
坑:@EnableScheduling你用对了吗?
我们可能会在服务中增加一些定时任务,这时候可能就会用到Spring中的@EnableScheduling,例如下面的代码。Main类中启动SpringFramework的IoC容器。package com.woods.schedule;import java.util.concurrent.TimeUnit;import org.springframework.context.annotation.AnnotationConfigApplicationContext;/** * @auth原创 2021-02-02 20:20:54 · 1255 阅读 · 2 评论 -
注意项:Java heap dump的坑
观察到服务的内存占用高,想把堆dump下来看看,然后你执行了下面的指令。jmap -dump:live,format=b,file=heap.hprof $pid之后使用MAT等工具打开查看,发现堆变小了?使用jstat -gc $pid看,出现了一次FullGC?查看GC日志,发现堆的大小从57.6G变成了16G?2021-01-24T10:29:55.221+0800: 131918.685: [Full GC (Heap Dump Initiated GC) 131932.469: [G原创 2021-01-24 21:21:57 · 738 阅读 · 1 评论 -
LeetCode-20200821-20200927
钥匙和房间题目。把二叉搜索树转换为累加树。给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree思路。给定的是一个二叉搜索树,我们知道二叉搜索树的中序遍历结果是一个非递减的序列。因此我们可以先遍历一遍树,得到所有节点的和。然后再原创 2020-09-26 20:17:16 · 75 阅读 · 0 评论 -
LeetCode-20200831-20200906
钥匙和房间题目。有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,…,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间之间来回走动。如果能进入每个房间返原创 2020-09-07 23:28:56 · 508 阅读 · 0 评论 -
LeetCode-20200824-20200830
重复的子字符串题目。给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。思路。O(N*N) 的解法比较好想。O(N)的解法是将两个 s连在一起得到ss,并移除第一个和最后一个字符。如果 ss 是该字符串的子串,那么 ss 就满足题目要求。代码。public boolean repeatedSubstringPattern(String s) { if (s == null || s.length() == 0)原创 2020-08-29 23:49:13 · 214 阅读 · 0 评论 -
Bug记录-Java-202008
DB操作和缓存操作的执行顺序问题假设我们有一个POJO为User,我们将User放入例如redis的缓存中。UserService使用UserDAO执行对User的数据库操作,使用UserCacheService执行对User的缓存操作。在UserService更新User时,例如增删改查User,需要先执行UserDAO的操作,再执行UserCacheService的操作。class UserSerive { /** * 正确的写法 * */ boolea原创 2020-08-23 20:20:24 · 102 阅读 · 0 评论 -
LeetCode-20200817-20200823
1 平衡二叉树题目。给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。思路。递归求解即可。左子树和右子树都是平衡二叉树并且左右子树的高度差小于等于1。代码。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode rig原创 2020-08-22 22:52:42 · 101 阅读 · 0 评论 -
LeetCode-20200810-20200816
1 计数二进制子串题目:给定一个字符串 s,计算具有相同数量0和1的非空(连续)子字符串的数量,并且这些子字符串中的所有0和所有1都是组合在一起的。重复出现的子串要计算它们出现的次数。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/count-binary-substrings思路:暴力解法的时间复杂度是O(N*N),会超时。注意到在处理位置i时,可以利用i-1位置的信息,因此可以通过动态规划进行求解。代码public i原创 2020-08-14 21:33:31 · 146 阅读 · 0 评论 -
Spring的扩展点3:监听器机制
自定义ApplicationEventListener自定义ApplicationEventListener的两种方式:实现ApplicationListener接口使用@EventListener注解package com.woods.listener;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration原创 2020-07-29 00:08:04 · 281 阅读 · 0 评论 -
SpringFramework源码分析(6):循环依赖的实现
import javax.annotation.PostConstruct;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.stereotype.C原创 2020-07-25 17:47:36 · 117 阅读 · 0 评论 -
SpringFramework源码分析(5):AOP的使用与实现
本篇文章介绍下SpringAOP的用法以及源码分析。1 SpringAOP使用示例我们定义四个类MathCalculator是业务类,我们希望在divide方法运行前后、正常返回或者抛异常时,打印一些日志。LogAspect是切面类,我们在LogAspect上标注了@Aspect注解,表示这是一个切面。在类中,我们使用@Pointcut定义了一个切点,使用@Before定义了前置通知、@After定义了后置通知、@AfterReturning定义了返回通知、@AfterThrowing定义了异常通原创 2020-07-20 00:23:43 · 166 阅读 · 1 评论 -
SpringFramework系列介绍
SpringFramework系列基于SpringFramework5.2.7版本。系列专题创建IoC容器1:Spring中核心组件介绍创建IoC容器2:基于AnnotationConfigApplicationContext的SpringIoC容器创建概览创建IoC容器3:类扫描创建IoC容器4:单实例Bean的创建Spring的扩展点1:BeanPostProcessorSpring的扩展点2:BeanFactoryPostProcessorSpring的扩展点3:ListenerS原创 2020-07-19 11:33:20 · 325 阅读 · 0 评论 -
SpringFramework源码分析(4):finishBeanFactoryInitialization方法详解
在SpringFramework源码分析(2):IoC容器AnnotationConfigApplicationContext的创建中,我们分析了SpringIoC容器创建的源码。我们已经知道在AbstractApplicationContext的refresh方法里,通过invokeBeanFactoryPostProcessors(beanFactory)完成了类的扫描,将类转化成了BeanDefinition并存储在了DefaultListableBeanFactory的beanDefinitionM原创 2020-07-18 00:26:43 · 222 阅读 · 0 评论 -
SpringFramework源码分析(3):invokeBeanFactoryPostProcessors方法与ConfigurationClassPostProcessor详解
我们在SpringFramework源码分析(2):IoC容器AnnotationConfigApplicationContext的创建中分析了AnnotationConfigApplicationContext初始化的代码。AnnotationConfigApplicationContext初始化的过程中,在AbstractApplicationContext#refresh()方法里,有一行代码invokeBeanFactoryPostProcessors(beanFactory),这行代码的主要执行用原创 2020-07-17 00:00:07 · 150 阅读 · 0 评论 -
SpringFramework源码分析(2):IoC容器AnnotationConfigApplicationContext的创建
1 一点建议我们在看源码的时候,不应该上来直接就开始读,在对作者的设计意图没有一丁点了解的情况下读源码,就是个从入门到放弃的过程,读完了也不知道到底在干嘛。这里给出一点个人的建议,在阅读源码前,我们需要先弄清楚一个组件或框架的整体流程是什么样子的,如果让我们来实现同样的功能,我们该如何思考以及从哪里下手。读Spring源码前,可以先看下Spring中重要的类有哪些,先有个大体概念与印象,可参考https://blog.csdn.net/sodawoods/article/details/107240123原创 2020-07-16 00:04:44 · 189 阅读 · 0 评论 -
Java classpath
1.我们的java程序是如何运行起来的?java程序运行时,通常是将.java文件编译成.class文件,即源文件编译成字节码文件,之后jvm通过ClassLoader加载字节码文件并实例化对象,然后运行程序。启动程序时,我们通常使用java -jar xxx.jar或者java packageA.packageB.Main的方式(当然可以加一些额外的Option和main函数参数)。我们来...原创 2020-03-03 22:28:24 · 94 阅读 · 0 评论