Java技术
文章平均质量分 92
疯狂哈丘
这个作者很懒,什么都没留下…
展开
-
备份jar包的一些坑
文章目录一、更新jar包时的一些现象二、jar包加载测试2.1、测试前的准备2.2、测试方案一2.3、测试方案二三、结论一、更新jar包时的一些现象我们在更新jar包时,经常会对旧的jar包做备份。目前常见的备份方式有以下几种:1、重命名旧的jar包,加上一些后缀。如 xxx.jar -> xxx.jar.bak2、在程序指定的classpath下创建一个backup目录(通常是程...原创 2020-03-01 22:31:37 · 8763 阅读 · 0 评论 -
不要替换运行中JVM的相关jar包
文章目录具体场景具体原因探索总结在java程序运行时,如果替换classpath下的某个jar包文件,可能会导致程序出现ClassNotFoundException**。具体场景我们要升级线上服务时,可能经常只需要替换其中一两个jar包即可完成升级。有时我们为了方便,经常会先替换完jar包再进行重启。其实这样的做法会有一个隐患,如果在你重启之前程序需要从这个jar包加载某个类的话,即使这个类...原创 2019-03-22 22:52:37 · 4285 阅读 · 0 评论 -
Java JVMTI和Instrumention机制介绍
文章目录1、JVMTI 介绍1.1 Agent的工作形式1.2 JDPA 相关介绍2、Instrumention 机制2.1 Instrumention支持的功能2.2 基于Instrumention开发一个Agent2.2.1 编写premain函数2.2.2 打成jar包2.2.3 编写测试类2.3 如何在运行时加载agent3、参考资料1、JVMTI 介绍JVMTI(JVM Tool I...原创 2019-03-09 16:17:35 · 3235 阅读 · 0 评论 -
Java Attach机制简介
文章目录一、利用Attach机制实现一个简单的Jstack二、Attach实现原理Attach Listener线程的启动1. 启动的时候通过jvm参数指定启动该线程。2. attach目标JVM成功后,目标JVM启动该线程。Attach Listener线程工作原理参考资料在JVM运行时,我们经常需要获取目标JVM运行时的相关信息。最典型的一个场景就是通过jstack命令输出当前的线程dump...原创 2019-03-09 09:43:09 · 10596 阅读 · 1 评论 -
Java 文件下载/上传限流算法
文章目录一、算法思路二、限流的完整java代码实现三、注意点四、具体demo的github地址在做文件下载功能时,为了避免下载功能将服务器的带宽打满,从而影响服务器的其他服务。我们可以设计一个限流器来限制下载的速率,从而限制下载服务所占用的带宽。一、算法思路定义一个数据块chunk(单位 bytes)以及允许的最大速率 maxRate(单位 KB/s)。通过maxRate我们可以算出,在ma...原创 2019-02-28 20:05:33 · 6394 阅读 · 13 评论 -
JVM进程诊断利器——arthas介绍
文章目录一、安装和使用arthas安装卸载二、athas的各个命令1. dashboard2. thread3. jvm4. sysprop和sysenv5. getstatic6. ognl7. sc 和 sm8. dump9. jad10. classloader11. redefine12. monitor13. watch14. trace15. stack16. tt17. option...原创 2018-12-07 22:12:17 · 8902 阅读 · 4 评论 -
Thread.sleep、Object.wait、LockSupport.park 区别
文章目录Thread.sleep() 方法Object.wait() 方法LockSupport.park() 方法实现原理和wait的不同对中断的处理总结题外话:关于java进程的关闭在java语言中,可以通过3种方式让线程进入休眠状态,分别是Thread.sleep()、Object.wait()、LockSupport.park()方法。这三种方法的表现和原理都各有不同,今天稍微研究了下这...原创 2018-11-30 13:35:52 · 13386 阅读 · 12 评论 -
httpclient架构原理介绍 & 连接池详解
本篇重点介绍httpclient连接池的相关原理以及介绍,顺带的介绍httpclient发送请求时的简单介绍,并会带上一些源码分析。本篇博文是基于httpclient的4.5.2版本进行介绍的。一、发送请求的流程原理几个关键的类和接口介绍在介绍架构原理前,先介绍几个类和接口,方便读者对httpclient的整体设计有个大概的概念。HttpClient:一个接口,即http客...原创 2018-09-13 20:11:19 · 19181 阅读 · 7 评论 -
输出debug日志前需要isDebugEnabled吗
最近在看一些代码时,发现经常在输出debug级别日志前做if判断,如下面的这段代码:if(LOGGER.isDebugEnabled()){ LOGGER.debug("name {}",name);}目的应该是作者想尽量的提高性能,减少不必要的输出。但是个人觉的这些应该是日志框架应该处理好的,因此对这个做了一些简单的调研 这样做的原因网上查了下,以前某些日志框...原创 2018-09-06 23:31:49 · 2700 阅读 · 0 评论 -
SpringMVC @RequestBody 为null问题排查
今天写一个springmvc接口,希望入参为json,然后自动转成自己定义的封装对象 ,于是有了下面的代码 @PostMapping("/update")@ApiOperation("更新用户信息")public CumResponseBody update(@RequestBody UserInfoParam param) { int userId = getUserId...原创 2018-09-11 18:57:37 · 8805 阅读 · 0 评论 -
logback配置详解 & 原理介绍
logback是java的日志开源组件,是log4j创始人写的,性能比log4j要好,目前主要分为3个模块logback-core:核心代码模块logback-classic:log4j的一个改良版本,同时实现了slf4j的接口,这样你如果之后要切换其他日志组件也是一件很容易的事logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能本篇博客会...原创 2018-09-01 13:45:16 · 19501 阅读 · 1 评论 -
apache-common-pool2对象池的使用
一、概述大多时候,我们获取对象的方法都是直接new一个。但是,对于大对象的构造,或者构造耗时比较久的对象,我们每次要使用都去new一个是很不科学的。比如数据库的连接对象、redis的连接对象、Http连接请求对象等等。在设计模式中有一个专门的模式来解决这种场景下的问题,即享元模式。享元模式其实很好理解,也就是构造一个对象池,这个对象池中维护一定数量的对象,需要的时候就从这个对象池中获取对象...原创 2018-07-14 12:02:37 · 3343 阅读 · 0 评论 -
ReentrantLock 实现原理详解
原创 2018-05-09 09:24:16 · 557 阅读 · 0 评论 -
CountDownLatch & Semaphore 实现原理详解
CountDownLatch 和 Semaphore 是Java中常用的两个同步器。他们的用法百度一下一大堆,我就不多做介绍了。下面我将从源码的角度分析一下这两个类的实现原理。阅读本篇文章之前,建议先理解AQS同步器的原理。可以看我之前写的一篇文章: Java同步器框架-AQS原理&源码解析理解了AQS的底层原理,再来看CountDownLatch 和 Semaphore 的实现...原创 2018-03-27 17:28:02 · 2938 阅读 · 0 评论 -
Java同步器框架-AQS原理&源码解析
一、自己实现一个简单的同步器Java提供了wait(),notify(),notifyAll()方法来支持线程之间的通信。这3个方法是Object类中定义的,因为在java中,Object是所有类的基类,所以所有的类都有这3个方法。我们可以某个类上执行wait方法让执行线程进入休眠状态,然后另外一个线程在这个对象上执行notify或者notifyAll() 来唤醒正在等待的线程。下面我...原创 2018-03-26 17:43:30 · 1208 阅读 · 1 评论 -
Java 定时任务实现原理详解
在jdk自带的库中,有两种技术可以实现定时任务。一种是使用Timer,另外一个则是ScheduledThreadPoolExecutor。下面为大家分析一下这两个技术的底层实现原理以及各自的优缺点。一、Timer1. Timer的使用class MyTask extends TimerTask{ @Override public void run() { ...原创 2018-03-18 20:26:07 · 58230 阅读 · 12 评论 -
Java线程池实现原理详解
原理概述其实java线程池的实现原理很简单,说白了就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。workerSet中的线程会不断的从workQueue中获取线程然后执行。当workQueue中没有任务的时候,worker就会阻塞,直到队列中有任务了就取出来继续执行。线程池的几...原创 2018-03-16 21:57:32 · 60516 阅读 · 34 评论