- 博客(26)
- 收藏
- 关注
原创 如何使用Eclipse内存分析工具定位内存泄露
本文以我司生产环境Java应用内存泄露为案例进行分析,讲解如何使用Eclipse的MAT分析定位问题一. 背景11月10号晚上8点收到报警邮件,一看是OOM打开公司监控系统查看应用各项指标发现JVM中老年代在持续增长(从上次发布10月30号到11月10号的12天内一直在增长, 存在内存泄露迹象)从图中可以看出, 从10月30号发布到11月10号oom期间11天老年代一直在缓慢上涨, 虽然有下降, 但整体趋势是上升的,平均每天泄露约50M内存, 说明每次都无法完全释放干净因为生产环境的JVM添加了
2021-01-05 21:37:13
845
3
原创 Java8:从永久代PermGen到元空间Metaspace
众所周知java8的新特性之一是完全删除了永久生成(PermGen)空间,自jdk7发布以来,Oracle就已经宣布了这一点。例如,自jdk7以来,内部字符串已经从PermGen空间中删除。jdk8版本完成了它的退役。本文将与大家分享到目前为止我们在PermGen继任者:Metaspace上发现的信息。我们还将比较hotspots1.7和hotspots1.8(b75)在执行Java程序“泄漏”类元数据对象时的运行时行为。一旦java8正式发布,围绕Metaspace的最终规范、调优标志和文档应该可以使用。
2020-10-27 22:54:03
274
原创 用Jcmd命令分析虚拟机Metaspace元空间
使用JDK 11时jcmd添加了一个新的诊断命令:jcmd:VM.metaspace 虚拟机元空间此命令对于分析元空间消耗非常有用。因此,让我们深入研究并使用它来重新访问我们的小WildFly服务器,它可以从以前的文章中获得。我们描述了命令输出和选项,以及如何使用它来发现典型的浪费点。虚拟机元空间,与JDK-8201572一起推出-由SAP和Red Hat提供-是jcmd的新增加。与该集合中的其他诊断命令一样,您将其命名为:jcmd<pid or process name> 虚拟机元空间.
2020-10-26 23:56:53
1428
原创 什么是Metaspace的压缩类空间?
在64位平台上,hotspot使用称为压缩对象指针(“CompressedOops”)和压缩类指针的优化技术。两者都是同一事物的变体。压缩指针是一种引用数据(Java堆中的对象或元空间中的类元数据)的方法,即使在64位平台上也使用32位引用。这有许多优点,例如指针大小更小,从而减少内存占用和更好地利用缓存,并且在某些平台上可以使用更多的寄存器。Note: A good explanation of Compressed Object Pointers can be foundhere: JVM A
2020-10-24 16:05:38
1184
转载 JVM元空间Metaspace的内存结构
我们深入研究元空间的架构。我们描述了各个层和组件,以及它们是如何协同工作的。这对那些想要破解hotspot和Metaspace或者至少真正理解内存的去向以及为什么我们不能仅仅使用malloc的人来说是很有趣的。与大多数其他非平凡的分配器一样,元空间是在层中实现的。在底部,内存是在操作系统的大区域中分配的。在中间,我们将这些区域分割成不太大的块,然后交给类装入器。在顶部,类装入器将这些块分割为调用程序代码。元空间的底层:虚拟空间列表VirtualSpaceListVirtualSpaceList:
2020-10-22 23:32:14
1256
转载 Metaspace元空间答疑解惑
我们都知道在Java8中用元空间取代了PermGen。但有几个问题:MetaSpace默认是GC收集的吗?即使PermGen是通过添加-XX:+CMSClassUnloadingEnabled这样的参数进行GC收集的,那么有什么比PermGen更好的MetaSpace呢?MetaSpace基于本机内存,所以它将java对象保存在磁盘上,而不是VM上?甚至元空间也会耗尽内存?如果是这样的话,我将摆脱记忆异常。默认情况下,元空间可以随着内存的增加而增长?MetaSpace默认是GC收集的吗?.
2020-10-21 23:09:15
589
转载 一文带你彻底了解Java异步
随着RxJava、Reactor等异步框架的流行,异步编程受到了越来越多的关注,尤其是在IO密集型的业务场景中,相比传统的同步开发模式,异步编程的优势越来越明显。那到底什么是异步编程?异步化真正的好处又是什么?如何选择适合自己团队的异步技术?在实施异步框架落地的过程中有哪些需要注意的地方?本文从以下几个方面结合真实项目异步改造经验对异步编程进行分析,希望能给大家一些客观认识:使用RxJava异步改造后的效果什么是异步编程?异步实现原理异步技术选型参考异步化真正的好处是什么?异步化落地的难点及
2020-10-17 22:24:42
1511
原创 Spock注意事项补充一
Spock和Mockito注解混用问题因为Spock并不支持Mockito和power mock的@InjectMocks和@Mock的组合,运行时会报错,如果你一定要使用对应的功能可以引入Mockitio为Spock专门开发的第三方工具:spock-subjects-collaborators-extension使用@Subject和@Collaborator代替@InjectMocks和@Mock代码如下:import spock.lang.Specificationimport com.blo
2020-10-10 11:03:46
443
原创 Spock如何模拟抽象类方法
我们平时写单元测试时经常会遇到调用抽象类或父类的方法,这些抽象方法可能是调用底层接口或数据库,需要mock掉,让抽象方法返回一个我们指定的值,以便测试当前代码逻辑的场景。下面讲下Spock如何结合power mock实现动态mock抽象方法一. 抽象方法或父类方法动态MockAbstractService 是个抽象类,我们需要把它的方法 parentMethod 模拟掉,返回我们预先设置的"期望值"代码示例:public abstract class AbstractService { S
2020-10-10 10:55:55
1406
原创 Spock注意事项及总结
注意事项Spock虽然好用,但要应用到实际项目中还是需要注意几个问题,下面讲下我们公司在使用过程中遇到的一些问题和解决方案。1. 版本依赖要使用Spock首先需要引入相关依赖,目前使用下来和我们项目兼容的Spock版本是1.3-groovy-2.5,以maven为例(gradle可以参考官网),完整的pom依赖如下:<spock.version>1.3-groovy-2.5</spock.version><groovy.version>2.5.4</gro
2020-08-26 23:08:53
2539
原创 Spock高级用法 - 动态mock
Spock代码讲解 - 静态方法测试这一章主要讲解Spock如何扩展第三方power mock对静态方法进行测试实现原理前面的文章讲到Spock的单测代码是继承自Specification基类,而Specification又是基于Junit的注解@RunWith()实现的:@RunWith(Sputnik.class)@SuppressWarnings("UnusedDeclaration")public abstract class Specification extends MockingA
2020-08-25 22:59:56
6047
原创 Spock代码讲解 - 异常测试、void方法测试
Spock代码讲解 - 异常测试异常方法测试有些方法需要抛出异常来中断或控制流程,比如参数校验的逻辑: 不能为null,不符合指定的类型,list不能为空等验证,如果校验不通过则抛出checked异常,这个异常一般都是我们封装的业务异常信息,比如下面的业务代码:/** * 校验请求参数user是否合法 * @param user * @throws APIException */public void validateUser(UserVO user) throws APIException
2020-08-25 00:28:17
2876
转载 Spock代码讲解 - mock第三方依赖、if else 分支测试
Spock代码讲解 - mock第三方依赖从这章开始会列举一些典型业务场景下如何使用Spock开发测试代码,具体功能和用法,以及groovy语法特点等(为方便演示,所有业务代码均为示例代码)1. Spock自带的mock用法在上一篇讲单元测试代码可读性和维护性的问题时举了一种业务场景,即接口调用,我们的用户服务需要调用用户中心接口获取用户信息,代码如下:/** * 用户服务 * @author 公众号:Java老K * 个人博客:www.javakk.com */@Servicepubl
2020-08-23 22:17:46
2519
转载 Spock单元测试框架让你从此爱上写单测
Spock 是什么?斯波克是国外一款优秀的测试框架,基于BDD思想,功能强大,能够让我们的测试代码规范化,结构层次清晰,结合 groovy 动态语言的特点以及自身提供的各种标签让编写测试代码更加高效和简洁,提供一种通用、简单、结构化的描述语言。引用官网的介绍如下(http://spockframework.org)Spock是一个Java和Groovy应用程序的测试和规范框架。 它之所以能在人群中脱颖而出,是因为它优美而富有表现力的规范语言。斯波克的灵感来自JUnit、RSpec、jMock、
2020-08-23 21:59:55
1544
原创 Java异步编程指南
在我们平时开发中或多或少都会遇到需要调用接口来完成一个功能的需求,这个接口可以是内部系统也可以是外部的,然后等到接口返回数据了才能继续其他的业务流程,这就是传统的同步模式。同步模式虽然简单但缺点也很明显,如果对方服务处理缓慢迟迟未能返回数据,或网络问题导致响应变长,就会阻塞我们调用方的线程,导致我们主流程的耗时latency延长,传统的解决方式是增加接口的超时timeout设置,防止无限期等待。...
2020-04-11 23:07:09
265
原创 线程池ForkJoinPool简介
ForkJoinPool线程池最大的特点就是分叉(fork)合并(join),将一个大任务拆分成多个小任务,并行执行,再结合工作窃取模式(worksteal)提高整体的执行效率,充分利用CPU资源。一. 应用场景ForkJoinPool使用分治算法,用相对少的线程处理大量的任务,将一个大任务一拆为二,以此类推,每个子任务再拆分一半,直到达到最细颗粒度为止,即设置的阈值停止拆分,然后从最底层的任...
2020-04-11 21:35:31
1174
原创 JVM学习笔记之client server端区别
这次和大家分享一些虚拟机方面的知识,主要是关于jvm的client和server端区别,支持的工作模式有哪几种以及他们之间的关系。java -version 命令大家都用过,大部分就是看下jdk版本或检查下环境变量的设置,但最后一行的信息也挺重要,如下图所示:Server VM表示我们的虚拟机类型,mixed mode表示虚拟机以混合模式工作。一. 虚拟机先说下本篇文章的内容都是基于Ho...
2020-04-11 21:05:44
743
原创 JVM学习笔记之codeCache
疫情期间把《深入理解java虚拟机》这本书又撸了一遍,顺便写下心得体会,和大家分享,温故知新。一. codeCache简介从字面意思理解就是代码缓存区,它缓存的是JIT(Just in Time)编译器编译的代码,简言之codeCache是存放JIT生成的机器码(native code)。当然JNI(Java本地接口)的机器码也放在codeCache里,不过JIT编译生成的native cod...
2020-04-11 20:31:46
2435
原创 Java开发规范之性能篇
JAVA开发中,大部分的性能问题原因并不在于JAVA语言本身,而是我们用这些语言写的程序,所以养成良好的编码习惯非常重要。下面给大家分享一些日常开发中比较常见的典型案例:类中的内部方法声明为private很多同学觉得这个无所谓,写代码时喜欢一个类里的所有方法都是public的(原因大家都懂),美其名曰:便于后期扩展。。对于不需要外部访问的方法改为私有的,不仅仅是因为面向对象的思想,符合数据...
2020-04-11 19:45:42
392
原创 Java踩坑记系列之线程池
线程池大家都很熟悉,无论是平时的业务开发还是框架中间件都会用到,大部分都是基于JDK线程池ThreadPoolExecutor做的封装,比如tomcat的线程池,当然也有单独开发的,但都会牵涉到这几个核心参数的设置:核心线程数,等待队列,最大线程数,拒绝策略等。先说下我们项目组在使用线程池时踩到的坑:线程池的参数设置一定要结合具体的业务场景,区分I/O密集和CPU密集,如果是I/O密集型业...
2020-04-11 19:24:56
1249
原创 Windows环境下如何进行线程dump分析
现在大部分公司都有自己完整的一套监控系统,比如美团的CAT,我们公司的监控系统也是基于CAT做的二次开发。一般测试环境或生产环境有问题可以直接使用这些系统查看线程和内存运行情况,分析排查问题。但对于我们开发人员来说还是有必要了解最原始的排查流程,也就是不借助这些系统,使用最基本的命令解决,毕竟了解了这些底层实现对自身发展也是有帮助的。网上这样的文章其实很多,比如排查cpu过高,死锁问题的文章,...
2020-04-11 18:21:31
1419
原创 JVM Metaspace内存溢出排查与总结
一. 现象前段时间公司线上环境的一个Java应用因为OOM的异常报警,导致整个服务不可用被拉出集群,本地模拟重现的现象如下:当时的解决方案是增加metaspace的容量:-XX:MaxMetaspaceSize=500m,从原来默认的256m改为500m,虽然没有再出现oom,但这个只是临时解决方案,通过公司的监控系统观察metaspace的使用情况还是在上升,而且后面随着业务访问量越来越大...
2020-04-11 17:58:08
7658
原创 Java在线诊断利器之Arthas
一. 简介Arthas是阿里在2019年9月份开源的一款java在线诊断工具,能够分析、诊断、定位java应用问题,例如:jvm信息、线程信息、搜索类中的方法、 跟踪代码执行、观测方法的入参和返回参数等等。Arthas最大的特点是能在不修改代码和不需要重新发布的情况下,对业务问题进行诊断,包括查看方法调用的出参入参、异常、监测方法执行耗时、类加载信息等,大大提升线上问题排查效率。二. 适用...
2020-04-07 23:01:41
2220
原创 Java开发利器之重试器
业务场景:代码中存在依赖不稳定的场景,需要使用重试获取预期结果或者尝试重新执行逻辑不立即结束,比如远程接口访问,数据加载访问,数据上传校验等对于异常需要重试的场景,同时希望把正常逻辑和重试逻辑解耦对方接口不支持异步回调在平时开发中经常会遇到需要调用接口和外部服务的场景,但是有些接口服务方不能立即返回数据,而是需要处理一段时间才能返回真实的业务数据,如果没有处理完则直接返回一...
2020-04-06 20:41:56
289
原创 Java踩坑记系列之Arrays.asList
java.util.Arrays.asList()可以方便的把一个数组转成ArrayList集合来使用如果对Arrays.asList()生成的集合使用增加或删除元素的操作将会报错代码如下:List list = Arrays.asList("a","b","c");list.add("d");输出结果:Exception in thread "main" java.lang.Uns...
2020-04-06 20:13:27
478
原创 Java踩坑记系列之BigDecimal
一. Bigdecimal的初始化精度丢失问题先来看下面代码的运行结果:BigDecimal bd1 = new BigDecimal(0.1);System.out.println("bd1="+bd1);BigDecimal bd2 = new BigDecimal("0.1");System.out.println("bd2="+bd2);BigDecimal bd3 = Big...
2020-04-06 19:55:06
459
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人