- 博客(65)
- 收藏
- 关注
原创 一次OpenJDK Bug导致线上问题的排查实践
本次问题排查过程中,遇到了一些超出平常接触到的问题,也出现了想重启服务器尝试“解决”问题的错误思路,同时也因为这些障碍,我萌发了更多思路、借助了更多的新工具,比如说UMP平台新提供的链路追踪功能,就是我破局的一个重要倚赖。出现了匪夷所思的问题,首先要保留好问题现场,比如说将VM堆和线程堆栈Dump保存,保存线上日志和GC信息等,特别是一些不能必现的问题,更需要问题现场才能进行排查,盲目的尝试重启解决问题,反而会掩盖存在的问题。
2022-09-07 21:16:02 1270 4
原创 入侵JVM?Java Agent原理浅析和实践(下)
声明:本文首发于京东零售技术公众号,为博主本人撰写投稿。运行时修改字节码了解到上述机制以后,我们可以通过在目标JVM运行时对其中的类进行重新定义,做到运行时插桩代码。我们知道ASM是一个字节码修改框架,因此就可以在类转换器中,对原本类的字节码进行修改,然后再对这个类进行重定义(retransform)。首先我们实现ClassFileTransformer接口,前文中在transform方法中并没有对于字节码进行修改,只是单纯的打印了一些信息,既然需要对字目标类的节码进行修改,我们需要了解下Class
2021-10-19 10:28:49 507 1
原创 入侵JVM?Java Agent原理浅析和实践(中)
声明:本文首发于京东零售技术公众号,为博主本人撰写投稿。JVM运行时Agent在JDK1.6版本中,SUN更进一步,提供了可以在JVM运行时代理的能力,和启动时代理类似,只需要满足:JAR包的MANIFEST.MF清单文件中定义Agent-Class属性,指定一个类,加入Can-Redefine-Classes 和 Can-Retransform-Classes 选项。JAR包中包含清单文件中定义的这个类,类中包含agentmain方法,方法逻辑可以自己实现运行时Agent可以在JVM运行时动
2021-10-19 10:18:41 577
原创 入侵JVM?Java Agent原理浅析和实践(上)
声明:本文首发于京东零售技术公众号,为博主本人撰写投稿。前言:在平时的开发中,我们不可避免的会使用到Debug工具,JVM作为一个单独的进程,我们使用的Debug工具可以获取JVM运行时的相关的信息,查看变量值,甚至加入断点控制,还有我们平时使用JDK自带的JMAP、JSTACK等工具,可以在JVM运行时动态的dump内存、查询线程信息,甚至一些第三方的工具,比如说京东内部使用的JEX、pfinder,阿里巴巴的Arthas,优秀的开源的框架skywalking等等,也可以做到这些,那么这些工具究竟是通
2021-10-19 10:11:42 1371 1
原创 Log4j2异步日志不打印问题
今天在做项目maven依赖关系优化时,遇到一个问题,项目可以正常启动,但是线上的日志却完全消失了。1、Log框架冲突?根据以往踩坑经验,怀疑是因为maven依赖的调整,有第三方包中依赖的log框架被加载了,从而导致项目原本使用的log4j2包没有被加载,因此排查了一下,使用idea的maven helper插件排查发现,有个好兄弟的包里引入了:这里不得不吐槽一句,提供给别人用的sdk包里,能别夹这种无用私货就别夹,一个slf4j-api包就够用了,乱引入依赖会导致别人的项目出问题嗷!于是我心里暗暗
2021-10-13 21:59:42 5861 2
原创 Spring集成ES客户端(7.5.2)
由于新版的ES逐渐放弃了对于Java TCP客户端的支持和维护,而是更推荐使用REST Client进行集群的操作,Springboot项目可以使用starter方便的集成使用,但是单纯的Spring项目并不能很优雅的直接使用RestHighLevelClient进行操作,因此需要手动封装一个FactoryBean进行集成。1、封装Spring的FactoryBean@Setter@Slf4jpublic class EsClientFactoryBean implements FactoryBea
2021-09-10 18:33:50 607
原创 ajax传输Json的正确方式
1.jquery的方式let data = { "name" : "xxx", "age" : 20}$.ajax({ url: 'localhost:8080/api/xxxxx', dataType: 'json', type: 'post', data: JSON.stringify(data), contentType: 'applica...
2020-02-27 18:42:12 1533
原创 Redis实践-存储Java对象
Redis作为目前主流的缓存数据库,提供了丰富的数据结构,这次做的项目里我们大量使用了Redis作为数据缓存,甚至在某些场景下直接作为了数据库使用(当然这是建立在公司内部基础组件足够可靠的前提下),由于项目是从零开始,在使用Redis的过程中,遇到了一些设计上的挑战和问题,因此特别在博客里记录下来。最基础的肯定就是Java对象的存储,使用SQL型数据库的时候,可以借助ORM框架直接进行把Java...
2019-12-16 21:43:43 2189
原创 Log4j2配置以及滚动日志文件
最近项目里用到了Log4j2,在这里咱们就不谈Log4j2性能了,可以看一下官方给的测评图,真香。但是使用时因为和Log4j配置上有很大区别,也踩了不少坑,这里总结一下。1.包依赖使用Log4j2首先要引入Log4j2的包依赖,这里以maven依赖为例。 <dependency> <groupId>org.ap...
2019-12-12 21:32:23 5260 1
原创 静态代理和动态代理
静态代理和动态代理,都是基于代理模式实现的一种对于类的方法的增强。静态代理所谓静态代理,其实就是在编译期完成代理(JAVA术语中喜欢把编译期完成的东西叫做静态XX),就是我们之前写的代理模式,被代理类和代理类实现同一个接口,然后代理类通过依赖被代理类,实现方法的增强。public class StaticProxy { static interface Image{ void dis...
2019-09-21 15:29:35 301
原创 HashMap扩容流程
文章目录为什么扩容?什么时候扩容?如何扩容?今天在和同时讨论HashMap的时候,提到了扩容和冲哈希的事情,然后我发现大家都是一种半懂不懂的状态。于是回去做了一番功课,写下这篇文章。HashMap的扩容,又被很多人叫rehash、重哈希,我本人是很反对这个叫法的,事实上HashMap扩容的时候,Node中存储的Key的hash值并没有发生变化,只是Node的位置发生了变化。首先说为什么需要扩...
2019-09-21 15:14:30 2761 2
原创 编译器重排序
在一些讲Java并发编程的书中,经常会出现JMM内存模型、volatile关键字、重排序、乱序执行等字眼,导致了有些刚开始学习Java并发编程的小伙伴一脸懵逼:这都是啥啊?文章目录1. 什么是编译器重排序1.1 定义1.2 举个例子1.3 重排序原因1.4 不仅仅是重排序2. 如何禁止?2.1 编译器屏障2.2 禁止重排序2.3 禁止寄存器存/取值2.4 volatile(C/C++)3. 结束...
2019-08-20 10:51:06 2821 3
原创 伪共享--多线程性能的破坏者
文章目录前言1.从CPU说起1.1 CPU缓存1.2 缓存行1.3 MESI协议2. 伪共享3. 解决方案4. 后记前言前几天看到了伪共享这个概念,但是并没有去做深入的了解,今天又看到了这个概念,才想起来要好好研究一下伪共享究竟是个什么东西,反而在学习的过程中又引发了我对JMM(Java内存模型)的思考,前几天有个同事分享了JMM相关内容,当时我感觉自己已经比较了解了,但是今天来看似乎并没有能...
2019-07-31 21:06:30 540
原创 关于equals和hashCode,看这一篇真的就够了
这几天在尝试手撸一个类似Lombok的注解式代码生成工具,用过Lombok的小伙伴知道,Lombok可以通过注解自动帮我们生产equals()和hashCode()方法,因此我也想实现这个功能,但是随着工作的深入,我发现其实自己对于equals()和hashCode()的理解,也处在一个很低级的阶段。因此痛定思痛,进行了一番深入学习,才敢来写这篇博客。文章目录1、equals在Java中含义2...
2019-04-21 14:27:54 4588 3
原创 Quartz源码分析(下)
上一篇文章中,我们分析了Quartz框架的Job和Trigger的源码实现,上篇也说到,Quartz的核心代码是Scheduler,在本篇中,我们会分析一下Scheduler的源码实现。文章目录1、核心入口类:QuartzScheduler2、调度线程类:QuartzSchedulerThread3、任务执行线程池:SimpleThreadPool4、任务执行线程类:WorkerThread5...
2019-04-20 20:34:30 1075 1
原创 IDEA中Maven配置问题全解决
最近换了工作环境,以前的IDEA配置都没了,记得上次配置自己的IDEA还是在两年前?然后构建Maven项目时遇到了一些小插曲,记录下解决方案(PS:新手教程向)1. idea中maven默认配置的坑首先打开File->Settings这里可以直接搜索maven,就可以进入idea的Maven配置选项。我这里是idea默认的maven配置,可以看到默认的Maven目录是idea内置...
2019-04-20 11:04:16 51502 12
原创 Quartz源码分析(上)
文章目录1.一个想法2.Quartz总体架构2.1 Job和JobDetail2.2 Trigger2.3 JobStore3.上篇小结1.一个想法最近项目中用到了Quartz框架,作为定时任务的调度框架,无论是和Spring的完美融合还是直接使用Java代码来进行使用,可以说都非常的简单且稳定,某天突然想到如果没有Quartz框架,我们应该如何实现一个纯Java代码的定时任务调度框架呢?...
2019-04-13 23:06:13 1271
原创 到北京好远
我不知道应该怎么表达现在的心情,是悲哀还是无奈。两小时前,我在某社交软件上随机匹配到一个女孩子,语音连麦,刚开始我没有抱着任何想法,只是她说觉着我的声音特别好听,我就和她有一句没一句的聊着,她让我唱首歌,我尬唱了张国荣的《当爱已成往事》,没有特别的原因,只是因为我特别喜欢《霸王别姬》,没想到后来会和她继续聊下去。我不知道她叫什么。她是一个十八岁的女孩子,是江西人。之前我对江西没有太多的印象,只...
2019-04-07 00:28:45 449 1
原创 Java线程池源码分析
文章目录一.Java线程池原理分析二.Java线程池源码分析1.接口继承关系2.核心类ThreadPoolExecutor2.1 入口方法 execute -- 调度器2.2 添加线程方法 addWorker2.3 Worker 内部类2.4 核心方法 runWorker -- 发动机2.5 任务获取方法 getTask3.流程回顾一.Java线程池原理分析上一篇是 线程池原理分析,只是说明了...
2019-03-31 22:17:35 394
原创 Java线程池原理分析
文章目录1. 线程池设计理念1.1 减少创建/切换线程开销1.2 线程池模型1.2.1 BlockingQueue1.2.2 corePool1.2.3 maxmumPool1.2.4 RejectedExecutionHandler1.2.3 execute2.线程池使用实例3. 线程池工作流程其实这篇文章在去年就已经写完了,但是因为懒一直没有整理成博客,今天痛定思痛下定决心,也要把它发表出来...
2019-03-31 20:52:34 624
原创 Docker入门--0.通俗易懂说docker
文章目录1.容器?虚拟机?2.Docker镜像2.1 Docker镜像就是不可写的一部分文件2.2 不得不说Docker容器3.Docker优势久闻Docker大名,但是又一直没有使用过Docker,接触Docker之前,也很疑惑Docker究竟是什么美女画皮,被各大厂商追捧,这个系列主要是Docker简易教程,尽量用最简单的例子说明Docker以及使用。1.容器?虚拟机?虚拟化技术已经发...
2019-03-16 19:00:18 680
原创 Kafka学习记录--1.简介与单机安装
关于Kafka,到目前(2019.1.9)为止,已经是比较成熟的一个消息中间件了,不需要太多的解释,Kafka本身的高性能和可靠性,在这里我就不多说了,这个系列的几篇文章,我将记录Kafka的安装,集群配置,还有一些语言的API使用(主要是Java和Python),当然在实际环境中的部署以及一些坑,会顺便说一说解决方案。文章目录1.Kafka的安装1.1 下载Kafka安装包1.2 启动Zoo...
2019-01-15 21:56:32 339
原创 实习的一点心得
九月份拿了京东的Offer以后,我没有选择去北京京东实习,而是跑到了我们学校所在地——青岛的一家公司实习,本身作为一个Java程序员,硬生生的在这写Python和PHP。这家公司是做图像识别的一家公司,但是算法岗不招本科生,本来想进来跟着大佬学一学图像识别的我,只能在这看公司的业务代码了。其实对于Python这门语言,大二学习了以后,陆陆续续在用,写写自动化脚本,写写爬虫什么的,其实蛮好用,不...
2018-11-30 16:15:57 943
原创 Redis中使用Lua脚本
文章目录1.关于Lua2.redis中使用Lua2.1 在shell中尝试使用Lua脚本2.2 传入参数的脚本3.Python中使用Lua嵌入redis1.关于LuaLua [1] 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy...
2018-11-14 14:43:31 1698
原创 RESTful 和webservice
文章目录1.关于RESTful2.关于webservice1.关于RESTful关于RESTful,在这个时代已经是让人耳熟能详的概念了,但是好像有没有人能把这个词解释清楚, 我认为,RESTful其实是一种基于特定uri编写风格的web项目,其本质是基于http协议web服务,说的更通俗一些,就是去搭建了一个web工程,发布到容器以后,其uri会以一种特定的形式出现,来表达不同的信息。这里...
2018-10-26 11:02:08 5113
原创 网易校招多线程笔试题
题目要求:一个文件中有10000个数,用Java实现一个多线程程序将这个10000个数输出到5个不用文件中(不要求输出到每个文件中的数量相同)。要求启动10个线程,两两一组,分为5组。每组两个线程分别将文件中的奇数和偶数输出到该组对应的一个文件中,需要偶数线程每打印10个偶数以后,就将奇数线程打印10个奇数,如此交替进行。同时需要记录输出进度,每完成1000个数就在控制台中打印当前完成数量,并在所...
2018-08-01 12:06:33 774
原创 近期总结
博客这两个月可能是没办法更新了,因为要开始秋招了。青岛的夏天,潮热,感觉整个世界都被汗糊上了一样,地板返潮,下雨后墙皮返潮,坐在椅子上发粘,躺在床上翻来覆去把凉席暖成热毯。很难熬,就一个人在宿舍对着书和电脑,舌头上都快长起了青苔。说说这一段时间的学习吧重读了《深入理解JVM》这本书,上次读这本书是寒假,当时对JVM的一切都感到新鲜,这次重读,主要是对于GC和调优的一些了解,但是还...
2018-07-26 19:37:39 312
原创 数据库(6)Mysql中explain分析SQL语句执行效率
这一段时间一直在学习关系型数据库,准备写一个小专题来总结一下这一段时间的学习结果。写下这篇博文之前,我学习了大量的关于数据库索引的基础知识,所以如果想更好的理解explain的用法,请先耐心学习 ——数据库索引。一. 什么是explain?二 . 关键字分析:2.1 id2.2 select_type2.3 table2.4 type(重点理解)2.4.1 ALL:2.4...
2018-07-03 20:20:13 4803 2
原创 数据库(5)主从复制和Mysql主从复制实验
这一段时间一直在学习关系型数据库,准备写一个小专题来总结一下这一段时间的学习结果。一. 什么是主从复制二. Mysql主从复制实验2.1 主数据库服务器配置2.1.1 打开主数据库的二进制日志2.1.2 主数据库创建新用户2.1.3 从数据库配置一. 什么是主从复制首先给大家明确一下主从复制的概念,有些初学者可能认为主从复制是数据库集群的一种实现方式,实际...
2018-07-02 12:15:40 442
原创 数据库(4)索引优化和SQL语句优化
这一段时间一直在学习关系型数据库,准备写一个小专题来总结一下这一段时间的学习结果。话说数据库优化一直是SQL型数据库的热门问题,包括从网络I/O方面,从硬盘I/O方面,从CPU计算方面等等很多手段,都可以对数据库进行优化。这篇文章主要总结了如何建立合适的索引提升查询速度,如何通过优化SQL提升语句执行速度。当然这些探讨都是浅尝辄止的,如果有任何谬误,希望大家指出。一. 索引优化...
2018-07-01 21:08:23 1026
原创 数据库(3)数据库索引
这一段时间一直在学习关系型数据库,准备写一个小专题来总结一下这一段时间的学习结果。一. 索引分类1.1 从索引的组织形式:聚集索引和非聚集索引1.1.1 聚集索引1.1.2 非聚集索引1.2 从索引的底层数据结构来看:B+树索引和hash索引1.2.1 B+树索引1.2.2 hash索引1.2 从索引的建立方式:主键索引,唯一索引,普通索引,组合索引和全文索引二.查...
2018-06-26 21:04:34 501
原创 数据库(2)数据库锁
这一段时间一直在学习关系型数据库,准备写一个小专题来总结一下这一段时间的学习结果。一. 锁的分类1.1 从锁的实现方式划分:乐观锁和悲观锁1.2 从锁的加锁机制:共享锁和排他锁1.3 从锁的粒度上来说:行级锁和表级锁二. 事物隔离等级和锁的关系1.1 写操作1.2 读操作一. 锁的分类网上很多博客都是直接说了一连串的锁,什么悲观锁乐观锁,什么读写锁,...
2018-06-25 22:24:53 273
原创 数据库(1)事物和事物的隔离等级
这一段时间一直在学习关系型数据库,准备写一个小专题来总结一下这一段时间的学习结果。一. 事物的四大特性二. 事物的隔离等级一. 事物的四大特性原子性(Atomatic):数据库事物包含的操作需要全部成功,否则进行回滚操作。一致性(Consistency):数据得操作前后要保持一致,不会出现预期之外的改变。隔离性(Isolation):隔离性是只多个用户并发访问同...
2018-06-25 11:05:00 398
原创 数据结构--哈希表(散列表)
在学习Java集合HashMap源码时,了解到了HashMap是底层的数据结构是基于哈希表(也叫散列表),意识到以前对于哈希表的学习也是浅尝辄止的,故做了一番功课以后,写下这篇文章。一. 定义1.1 如何存储键值对?1.2 哈希算法1.3 哈希表1.4 哈希冲突链地址法(Separate chaining)开放地址法(Open addressing)再哈希法(rehash)...
2018-06-07 17:07:47 761
原创 Java并发--ReentrantLock实现分析
ReentrantLock是基于AQS实现的可重入独占锁,如果还不了解AQS实现原理的同学可以先去AQS原理分析学习一哈。如果文章中由任何不妥或者谬误之处,请批评指正。公平锁or非公平锁1. 非公平锁1.1 非公平锁的获取2. 公平锁2.1 公平锁的获取3. 解锁过程公平锁or非公平锁ReentrantLock核心功能的实现,依赖于继承AQS类实现的...
2018-06-05 18:43:07 334
原创 Java并发--AQS源码分析
一、AQS整体设计思路1.1 CAS操作+volatile关键字+改造的CLH队列二、独占模式2.1何为独占模式2.2 独占模式下获取共享资源2.2.1 直接获取了共享资源的操作权2.2.2 没有获取了共享资源的操作权2.3 独占模式下释放共享资源2.3.1 释放资源三、共享模式3.1共享模式获得资源如果说CAS操作,是J.U.C包的灵魂,那么...
2018-06-03 22:11:16 1702
原创 Java并发--Java中的CAS操作和实现原理
这几天准备梳理一下Java多线程和并发的相关知识,主要是系统的梳理一下J.U.C包里的一些东西,特别是以前看过很多遍的AQS和实现类,还有各种并发安全的集合类。最重要的就是这个CAS操作,可以说是整个J.U.C包的灵魂之处。1.什么是CAS?2.JAVA中的CAS操作实现原理3.concurrent包中CAS的应用4.小结1.什么是CAS? CAS:Compare...
2018-06-01 10:04:22 8728 1
原创 Java多线程--正确理解interrupt()、interrupted()和isInterrupted()
1.interrupt()2.isInterrupted()3.interrupted()1.interrupt()理解这个函数,可以首先从它自己的JavaDoc入手。 Interrupts this thread. Unless the current thread is interrupting itself, which is always pe...
2018-05-31 16:57:56 5229
原创 JavaNIO--5.多Reactor模式
一. 多Reactor模型1.1最优的解决方案1.2模型代码1.2.1主反应器1.2.2次反应器1.3模型代码分析二. 总结一. 多Reactor模型1.1最优的解决方案当我们经历了最初的Reactor模型,实现了单线程基于Selector选择器的NIO通信模式,到升级为多线程Reactor模型,由一个Selector实现事件的分发到不同的线程进行服...
2018-05-20 21:01:20 1061 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人