前面有两篇铺垫博文,在博文《200303-如何优雅的在java中统计代码块耗时》,其最后提到了根据利用java agent来统计方法耗时
博文《200316-IDEA + maven零基础构建java agent项目中则详细描述了搭建一个java agent开发测试项目的全过程
本篇博文将进入java agent的实战,手把手教你如何是实现一个统计方法耗时的java agent
前面有两篇铺垫博文,在博文《200303-如何优雅的在java中统计代码块耗时》,其最后提到了根据利用java agent来统计方法耗时
博文《200316-IDEA + maven零基础构建java agent项目中则详细描述了搭建一个java agent开发测试项目的全过程
本篇博文将进入java agent的实战,手把手教你如何是实现一个统计方法耗时的java agent
Java Agent(java探针)虽说在jdk1.5之后就有了,但是对于绝大多数的业务开发javaer来说,这个东西还是比较神奇和陌生的;虽说在实际的业务开发中,很少会涉及到agent开发,但是每个java开发都用过,比如使用idea写了个HelloWorld.java,并运行一下, 仔细看控制台输出
本篇将作为Java Agent的入门篇,手把手教你开发一个统计方法耗时的Java Agent
SpringBoot指定com.mysql.cj.jdbc.Driver
来操作mysql数据库时,发现时区有八个小时的差距,主要原因在于需要在url中指定时区信息,否则会有这个问题
在我们的实际开发中,多多少少会遇到统计一段代码片段的耗时的情况,我们一般的写法如下
1 | long start = System.currentTimeMillis(); |
上面的写法没有什么毛病,但是看起来就不太美观了,那么有没有什么更优雅的写法呢?
HashMap对于javer而言,可以说是非常非常熟悉的一个容器类了,可以说99.99%的java开发者都用过它,那么你知道怎样创建一个HashMap是最优雅的方式呢?
在日常的编码中,有时会遇到,需要重复获取InputStream中的数据的需求;然后一般的流,只能读一次,读完就没了;那么如果我希望有一个可以重复读取数据的InputStream,可以怎么操作?
平时使用ProtoStuff作为序列化工具,对于一些POJO对象序列化,但是在实际使用中,发现针对BigDecimal对象进行序列化时却出现了问题
下面记录一下这个问题
今天开发过程中,遇到一个鬼畜的问题,在DO的某个成员上添加@Deprecated
注解之后,通过ProtoStuff反序列化得到的DO中,这个成员一直为null;花了不少时间才定位这个问题,特此记录一下
列表排序,我们可以说是用的比较多了,写起来也很溜,继承Comparable
接口,实现compareTo
方法,然后直接使用java.util.List#sort
即可
虽说如此简单,今天却是一脚踩进去,花了不少时间才爬出来,下面复盘一下这个现场
从db中查了一个BigDecimal数据,希望按照四舍五入的方式进行取整,发现直接使用 intValue
不太对,特此记录一下正确姿势
1 | new BigDecimal(4.51).setScale(0, RoundingMode.HALF_EVEN).intValue() |
map的迭代删除,和我们常见的list,set不太一样,不能直接获取Iteraotr对象,提供的删除方法也是单个的,根据key进行删除,如果我们有个需求,将map中满足某些条件的元素删除掉,要怎么做呢?
我们有这么一个场景,给你一个列表,可以动态的新增,但是最终要求列表升序,要求长度小于20,可以怎么做?
这个还不简单,几行代码就可以了
1 | public List<Integer> trimList(List<Integer> list, int add) { |
java应用启动之后,有办法查看jvm参数么?
可以通过jps -v
来实现
1 | jsp -lv |
如阿里的java进程输出如下
1 | 28996 com.aliyun.tianji.cloudmonitor.Application -Djava.compiler=none -XX:-UseGCOverheadLimit -XX:NewRatio=1 -XX:SurvivorRatio=8 -XX:+UseSerialGC -Djava.io.tmpdir=../../tmp -Xms16m -Xmx32m -Djava.library.path=../lib:../../lib -Dwrapper.key=drcJnFxDcXCZH8of -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.disable_console_input=TRUE -Dwrapper.pid=28989 -Dwrapper.version=3.5.27 -Dwrapper.native_library=wrapper -Dwrapper.arch=x86 -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 |
采用fastjson作为项目的json序列化和反序列化工具,遇到一个蛋疼至极的问题, 如Map,key为int,则输出的字符串中,key没有被双引号括起来,导致前端解析失败
作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomcat的底层是怎么支持http服务的呢?大名鼎鼎的Servlet又是什么东西呢,该怎么使用呢?
在初学java时,socket编程是逃不掉的一章;虽然在实际业务项目中,使用这个的可能性基本为0,本篇博文将主要介绍如何使用socket来实现一个简单的http服务器功能,提供常见的get/post请求支持,并再此过程中了解下http协议
之前偶然在一个开源项目中看到下面这种写法,深感惊奇,当时没有记录,后来果不其然就忘掉了这种写法,现在又看到这种写法,特此记录
1 | long price = 1_000_123L; |
如何获取应用中,所有活动的线程?
1 | ThreadGroup group = Thread.currentThread().getThreadGroup(); |
上面是获取当前线程所在的ThreadGroup, 然后将这个分组内的所有线程丢到slackList数组中,实际测试时,数组大小可能是大于实际的线程数的(而且可能性特别大)
通过ThreadGroup,还可以获取上一层的Group, 然后遍历所有的线程
在做 https://github.com/liuyueyi/quick-task
项目时,遇到了一个蛋疼的问题,不知道什么时候加了个Groovy脚本之后,整个项目就编译不过了,特此记录一下
相关博文: jvm调优的工具介绍
小结一下用的几个调优参数,特别是自带的jvisualvm
,比较好用,但是功能丰富完整方面比jprofile要欠缺一点,后面有时间补上jprofile的使用过程
jvm的垃圾回收算法,除了我们熟悉的引用计数判断对象是否活着之外,其他还有那些有意思的东西呢?
总是听到的年轻代年老代又是啥?
传说中的YoungGC(MinorGC) 和 FullGC的时机是什么,又干了些啥?
Update your browser to view this website correctly. Update my browser now