Java
文章平均质量分 64
bruce128
https://github.com/bruce256?tab=repositories
展开
-
HashMap在并发场景下的问题
hashmap在并发情况下的问题本文的源码展示的是1.8.0_401版本。原创 2024-09-14 20:00:37 · 287 阅读 · 1 评论 -
camel丢失请求body问题排查
项目组要和被收购的公司做接口对接,使用camel进行集成。在使用的过程当中,我们几个小伙伴都遇到了一个相同的问题:请求request body的内容失踪了。原创 2023-12-18 19:25:15 · 1067 阅读 · 0 评论 -
K8S容器OOM killed排查
docker耗用完内存前,堆内存并没有达到上限,于是没有触发老年代GC,内存没有降下去。如果容器OOM killed,容器里的jvm进程没有Full GC,那么肯定是MaxRAMPercentage参数太高,导致堆内存没有用到上限,无法触发堆内存(老年代)GC。当实例内存超过95%时,对比top显示的的jvm进程内存和ps stats输出的docker实例内存信息,其余进程耗用的内存忽略不计。遂将内存增加到4GB。4 由于堆内存没有的到达上限,但是整个jvm进程内存超出了容器的内存限制。原创 2023-08-30 09:20:09 · 2154 阅读 · 0 评论 -
springboot 2.6.6接入prometheus
springboot是2.6.6版本,刚开始用的是simpleclient客户端原创 2023-07-03 22:55:32 · 805 阅读 · 0 评论 -
aop切面调用失效问题排查
应用里有较多的地方访问外部供应商接口,由于公网网络不稳定或者外部接口不稳定(重启,发版,ip切换)的原因,经常报502或者504错误。网上搜索有很多帖子反馈@Retryable注解不生效,不生效的点在于:切面切的方法,是在所在的类里被另外的方法调用的,而不是被外部类直接调用。不仅仅是@Retryable有这个问题,所有的切面实现的功能,如果这样调用都有问题。通过生成的类可以发现,如果直接调用没被代理的方法,那么调用的是父类SayHello的方法,也就是没被加强的方法。查看动态生成的类(第三个)原创 2023-05-04 23:08:42 · 1612 阅读 · 0 评论 -
Mybatis中用typehandler优雅的解决枚举类型的读写
表字段是码值的时候,一般会有一个枚举(enum)类对应。我们可以把DO类的对应字段定义为枚举类型,用mybatis的typehandler来处理读写。通过枚举类强管控码值的变化,就不会随着时间的推移,代码的可读性和可维护性大大降低了。5 insert或者update的时候需要在字段后面带上typehandler。1 枚举字段类型定义, 我们的目标是直接把这个类型入库,并正确的读取出来。这样做之后,就只需要维护枚举类型,数据库字段和DO类的注释都不需要了。2 typehandler定义, 需要继承。原创 2022-08-19 17:35:52 · 681 阅读 · 0 评论 -
全链路参数透传
背景现在的系统大多是基于SOA的分布式应用。跨服务调用的时候,存在线程上线文里的重要信息如traceId,租户id无法传递给下一个应用。要解决的问题内部系统通过RocketMQ交互时,traceId如何透传到消息消费应用内部系统通过Dubbo调用时, traceId如何透传到服务提供方解决方案1 rocketMQ异步透传解决方案发消息时,通过切面拦截 DefaultMQProducer.send 方法,将traceId从threadLocal写入Message的properties里面原创 2022-03-28 10:40:12 · 3239 阅读 · 0 评论 -
《深入理解java虚拟机》读书笔记:Java对象的内存布局
一个int类型4占4个字节的内存,一个byte一个字节。但是他们的封装类型Integer,Byte对象内存损耗还是一样的吗?并不是,而且差距十分大。 HotSpot虚拟机中,一个普通的Java对象由3部分构成对象头类内定义的实例数据内存对齐 2不必多说,Java对象不存定义好的实例字段存啥。 对象头又分两部分,Mark Word和类型指针。Mark W原创 2016-03-30 21:46:50 · 2820 阅读 · 3 评论 -
JDK1.8 JVM运行时数据区域划分
一、JDK1.8 JVM内存模型概览这里介绍的是JDK1.8 JVM内存模型。1.8同1.7比,最大的差别就是:元数据区取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元数据空间并不在虚拟机中,而是使用本地内存。二、各区域介绍1. 程序计数器每个线程一块,指向当前线程正在执行的字节码代码的行号。如果当前线程执...原创 2018-02-26 20:53:55 · 56630 阅读 · 47 评论 -
java删除文件夹的方法
先看File.delete()的方法api文档 Deletes the file or directory denoted by this abstract pathname. If this pathname denotes a directory, then the directory must be empty in order to be dele原创 2018-01-16 10:53:48 · 59193 阅读 · 14 评论 -
java.io.NotSerializableException: java.util.ArrayList$SubList
今天和同事联调一个接口,抛未序列化异常。异常直接指向List类,我的第一反应是List的泛型类没有实现Serializable。Caused by: java.io.NotSerializableException: java.util.ArrayList$SubList at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.原创 2017-11-18 23:04:22 · 5715 阅读 · 0 评论 -
用正则表达式统计关键词信息
要为项目150余个代码点添加统一监控。监控点的key是按规律定义的,以chat3打头,alert结尾。我必须先把这150余个key从代码中搜索出来,然后在统一监控中按key逐个添加监控。如果用Eclipse自带的搜索功能搜索文本,可以,但是必须逐个去文件夹树里找,略显麻烦。 324/2,一共162个监控点,逐个点进去找到自己要的信息实在太麻烦!为什么不写代码统计呢?!深搜文件...原创 2013-03-21 18:46:51 · 2097 阅读 · 0 评论 -
如何在Eclipse下查看JDK源代码
不会看JDK源代码,相当于没学过JAVA。 从百度上找到一篇帮助我解决了如何在Eclipse下查看JDK源代码 的文章。 在Eclipse中查看JDK类库的源代码!!! 设置: 1.点 “window”-> "Preferences" -> "Java" -> "Installed JRES"2.此时"Installed JRES"右边是列表窗格,列出了系统中的转载 2011-10-19 12:32:47 · 78857 阅读 · 23 评论 -
log4j指定包或类打到单独的日志文件的配置
根据日志定位问题的时候,如果所有的日志都打到一个日志文件里,查问题就很不直观了。 一、指定某个路径的包或类打到单独的日志文件 log4j.xml 配置如下: <appender name="poll" class="org.apache.log4j.DailyRollingFileAppender"> <param name="encoding" valu...原创 2015-01-15 17:53:12 · 15301 阅读 · 3 评论 -
快速创建和mysql表对应的java domain实体类
今天创建了一个表有十几个字段,创建完之后必然要写一个与之对应的java domain实体类。这不是重复的工作吗?为什么不先把这个表的所有的字段查出来,然后放到linux环境下,用sed工具在每一行的前面加上“private String ”,每一行的后面添加“;”。这样可以节省很多重复工作。下面上sql代码和sed命令。 查询一个mysql表所有列的列名的sql代码如下:SELECT...原创 2014-11-17 16:23:31 · 8602 阅读 · 0 评论 -
No WebApplicationContext found: no ContextLoaderListener registered?报错解决
今天跑了下新搭的一个SSI框架。报如下错误:严重: Exception sending context initialized event to listener instance of class com.j.chat.upgrade.web.core.SystemLaunchListenerjava.lang.IllegalStateException: No WebApplicat...原创 2014-07-14 20:05:07 · 31807 阅读 · 0 评论 -
java代码模拟DOS下的tree命令
DOS下的tree命令可以把当前路径当做根路径,然后把文件树以树的形式展示出来。这个命令的实现不难,深搜一下文件树就可以了。import java.io.File;import java.util.Scanner;public class Tree { public static int depth = 0; public static void main(String[] a...原创 2014-05-09 18:37:29 · 3550 阅读 · 0 评论 -
《effective java》读书笔记:尽量返回容量为0的数组或集合
今天测试3.0的后台代码时,遇到了一个空指针的bug,是由于调用的方法返回的是集合,由于实际返回的是null,后头有调用了这个对象的方法,导致空指针。这段代码的质量需要改善,如果返回容量为0的集合,则完全可以避免空指针。先贴错误代码。public Result queryStoreServiceAttendList(AttendParamVo vo) { Result result ...原创 2013-03-13 18:47:15 · 2928 阅读 · 1 评论 -
Java程序员的第一个Python小程序:京东畅销书榜爬虫
毕业后的5年多时间里一直在Java的生态系统里游走,很少触碰其他非Java技术栈。职业安全感隐隐的警告我不能一直停留在自己的舒适区里。时下最火的莫过于AI, 而AI时代带火了Python,那就学学Python。学习一门技术最好的方法是:learning by doing. 在实践中学习。我选择了爬虫作为自己的第一个练手小项目。爬的是京东的计算机与互联网图书销量榜。 html结构分析 ...原创 2018-06-09 00:16:53 · 2929 阅读 · 8 评论 -
使用QRCode生成二维码
我们项目的安卓客户端开发出来了,下载页面上要呈现出二维码以方便移动端以方便移动端用户下载。QRcode是日本人94年开发出来的。首先去QRCode的官网http://swetake.com/qrcode/java/qr_java.html,把要用的jar包下下来,导入到项目里去。qrcode需要设置一个版本号,这个版本号代表你生成的二维码的像素的大小。版本1是21*21的,版本号每增加1,边长增加...原创 2013-07-17 18:15:20 · 25943 阅读 · 8 评论 -
volatile型变量自增操作的隐患
用FindBugs跑自己的项目,爆出两处An increment to a volatile field isn’t atomic。相应报错的代码如下:volatile int num = 0;num++; FindBugs针对这种类型的错误给出了相应的解释 An increment to a volatile field isn’t atomic This code incremen原创 2016-11-23 11:44:49 · 4914 阅读 · 5 评论 -
剖析金额不能用浮点数表示的原因
近期支援双十一红包项目。参与到了一个涉及到钱的项目,开发自然十分的谨慎。先抛出我有问题的代码,作用是把以分为单位的金额转成以元为单位的字符串。long adjustFee;String.valueOf(adjustFee / 100.0); 很自信的以为这行代码简洁明了的完成了使命。@壹双 同学review了我的代码后,指出这段代码会造成精度丢失的问题。先演示一个demo,构造一个浮点数丢失精度原创 2016-09-13 21:28:52 · 8829 阅读 · 9 评论 -
Unable to locate Spring NamespaceHandler for XML schema namespace问题排查
今天接公司其他项目组的JSF外部服务接口,写单元测试的时候,报如下错误。Caused by: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from relative locati原创 2015-12-03 10:47:57 · 12618 阅读 · 3 评论 -
ServiceConstructionException的解决办法
线上调用WebService的线程报错: javax.xml.ws.WebServiceException: org.apache.cxf.service.factory.ServiceConstructionException at org.apache.cxf.jaxws.ServiceImpl.getPort(ServiceImpl.java:317) at org.apache.c原创 2013-11-21 09:24:39 · 35163 阅读 · 4 评论 -
Map对象用JSON反序列化的方法
我们项目组的A系统依靠B系统写入Redis中的数据对象工作。这个对象是一个Map对象,Map对象写入Redis很简单,先JSON化,然后Set入Redis即可。但是用JSON提供的反解析方法的时候,得到的是Map 类型,而我希望得到的是Map类型。也就是DDRouteRuleEntry类型并没有被正确的解析。只好顺应这个结果进行反序列化,然后将每个JSONObject对象再次反序列化成DDRo原创 2013-11-12 17:57:54 · 16844 阅读 · 1 评论 -
NIO与普通IO文件读写性能对比
最近在熟悉java的nio功能。nio采用了缓冲区的方式进行文件的读写,这一点更接近于OS执行I/O的方式。写了个新旧I/O复制文件的代码,练练手,顺便验证一下两者读写性能的对比,nio是否真的比普通I/O更快了。 拿来测试复制性能的文件是104MB的视频问加你,测试代码如下:package nio;import java.io.FileInputStream;import j原创 2013-12-15 21:29:14 · 6991 阅读 · 5 评论 -
java NIO 学习笔记
项目组是做IM产品的,服务端当然用的是NIO技术做通信底层。但是一直都是对NIO有些理论的了解,没有实践,最近有空了,就实践了下NIO。 NIO,新IO,也称之为非阻塞IO。非阻塞是它跟传统IO的最重要的区别之一。传统IO用Socket进行通信,NIO则用channel进行消息交互。channel必须注册到selector上,把它感兴趣的事件告诉selector。这是个观察者模式的实现。原创 2015-06-10 17:53:56 · 1473 阅读 · 0 评论 -
JSP页面请求参数乱码问题的解决
这几天开发的时候遇到了小问题,JSP页面传到后台的表单参数是乱码。 我的JSP页面的编码格式是utf-8,同时设置了request.setCharacterEncoding(“utf-8”),最后发现问题所在,同事在struts文件里配了个常量:。网上查了这个常量的作用后,锁定了问题。 这个常量相当于request.setCharacterEncoding(“gbk”),于是我原创 2012-10-15 15:01:27 · 1622 阅读 · 0 评论 -
454 Authentication failed, please open smtp flag first!用QQ邮箱测试报错
我用QQ邮箱测试javamail发送邮件的功能,用户名密码设置正确,却总是发不出邮件。开启下QQ邮箱的smtp服务器设置即可。原创 2013-04-05 17:36:17 · 7910 阅读 · 2 评论 -
服务器磁盘爆满引发的dubbo请求超时问题
今天遇到了运用dubbo开发过程中经常遇到的问题,请求超时Caused by: com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method subscribe in the service com.alibaba.dubbo.registry.RegistryService. Tried 3 times of the prov原创 2016-02-15 16:35:35 · 15034 阅读 · 2 评论 -
《Java核心技术》读书笔记:CyclicBarrier的使用示例
考虑这么一个情景:当多个线程运行到某处的时候,需要将所有的线程的计算结果汇总。那如何控制这些线程计算子问题结束后,在汇总的代码处等待其它线程尚未计算完的线程呢?可以考虑使用CountDownLatch和CyclicBarrier。CountDownLatch只能使用一次,CyclicBarrier作为线程集结点 ,却可以循环使用。“cyclic”循环的意思。 当跑的快的线程运行到Cycl原创 2013-12-25 23:34:54 · 1999 阅读 · 0 评论 -
利用zookeeper的发布/订阅模式实现配置动态变更
ZooKeeper的Watcher事件机制可以说分布式场景下的观察者模式的实现。基于这个watcher事件机制,配合注册到特定的ZNode节点,可以实现Java应用的配置运行时的变更。在学习zookeeper之前,听同事说配置可以在运行时动态变更,觉得不可思议。研习了zookeeper之后,实现这个功能是很easy的。 发布/订阅系统设计起来无非两种模式,推和拉。 1. 推模式,服务端负责把原创 2016-10-06 22:02:29 · 8326 阅读 · 0 评论 -
Java foreach语法糖探秘
前不久线上用foreach循环,由于没判空,导致线上报了很多空指针异常。这两天梳理下foreach语法糖,看看jvm底层到底如何实现的。 先写一个foreach的demo,包含对list对象和数组对象的遍历。package com.jd.lvsheng;import java.util.ArrayList;import java.util.List;public class Mai原创 2016-06-01 14:36:58 · 3248 阅读 · 0 评论 -
Spring mvc 单元测试Demo
以前用struts框架的时候,给HTTP接口做测试,只能在浏览器上拼url和参数测,十分麻烦,而且不能自动化。但是用了Spring mvc之后,这种状况改变了。spring-test模块对spring mvc的接口提供了良好的单元测试框架支持。有了这个框架,便可以对HTTP接口进行自动化单元测试了。对产品迭代开发的重要意义不言而喻。 首先我们需要添加spring-test的依赖。 org.原创 2016-04-23 17:06:57 · 4760 阅读 · 0 评论 -
串行程序并行化
考虑这样一个问题:统计某个工程的代码行数。首先想到的思路便是,递归文件树,每层递归里,循环遍历父文件夹下的所有子文件,如果子文件是文件夹,那么再对这个文件夹进行递归调用。于是问题很轻松的解决了。这个方案可以优化吗? 了 再回想这个问题,可以发现,循环里的递归调用其实相互之间是独立的,互不干扰,各自统计自己路径下的代码文件的行数。于是,发现了这个方案的可优化点——利用线程池进行并行处理。于是一原创 2016-05-16 23:15:15 · 8116 阅读 · 0 评论 -
ThreadPoolExecutor并行编程Demo
今天要把线上600M的日志进行信息抽取,提取出被多次编码的中文账号。日志文件有200W行,用单线程的程序跑,花了20分钟。感觉速度不够快,而且CPU的使用率一直是25%, 根本没有有效的利用硬件资源。于是尝试用多线程的程序进行提速,CPU耗到了接近100%, 程序内存耗到了200M,最终花了14分钟把数据跑完,提速了6分钟,感觉还不错。因为对JDK的多线程框架还不熟悉,多线程的代码改写了好...原创 2014-11-05 11:05:24 · 2712 阅读 · 0 评论 -
借助共享缓存redis实现分布式锁
新开发的系统需要控制每个时刻回收缓存的GC线程有且只有一个在运行,如果有多个线程同时运行,会造成系统崩溃。如果只有一个JVM进程那么很好办,简单的借助synchronized关键字就行了。可是我的系统要部署在多台服务器,每台服务器上部署多个实例上。而synchronized仅仅在单进程里有用。 考虑借助共享数据源redis实现功能。 redis提供一个方法,SETNX key原创 2015-07-03 18:02:56 · 5616 阅读 · 0 评论 -
JDK的动态代理
动态代理是Spring AOP的核心原理。以前一直停留在使用的表层认识上,这一阵子抽空研究了下。 先说下静态代理,静态代理每次只为一个类服务。而且需要为每个类编写代理类代码。动态代理的优势则在于,不用为每个代理类编写代码,而是自动根据Class的文件格式去拼装代理类的字节码。 DEMO 接口package reflect;/** * Created by cdlvsheng原创 2016-04-22 21:46:43 · 1981 阅读 · 0 评论 -
《Java并发编程的艺术》读书笔记:Fork/Join框架
JDK1.7提供的Fork/Join框架,用于把大任务拆解成小任务,多线程运行这些小任务,最后把小任务的结果求和。看到这个思想,是否觉得很熟悉?这个和算法里的分治算法如出一辙,Divide and Conquer,分而治之,各个击破。可以看做是分治算法的并行框架。从字面上理解,Fork,复制,把一个大任务切割并拷贝成多份小任务;Join,合并,把所有小任务的结果合并成大任务的结果。 这本原创 2016-04-04 16:18:21 · 3250 阅读 · 0 评论 -
Arrays.asList()源码剖析
将一个数组转化为一个List对象,一般会想到Arrays.asList()方法,这个方法会返回一个ArrayList类型的对象。但是用这个对象对列表进行添加删除更新操作,就会报UnsupportedOperationException异常。 public static List asList(T... a) { return new ArrayList(a); }原创 2014-03-20 19:18:27 · 4306 阅读 · 1 评论