Java集成Groovy性能优化与最佳实践初探
一.使用场景与目的:
Groovy是运行在JVM上的和Java类似,但是写法更精简的,动态类型语言。
Java集成Groovy在我们这里使用的场景是业务同学自行编辑配置的DSL转成groovy为目标语言,而groovy需要最终集成到我们的MWP-ROOTER Java代码中。由于这里集成到MWP后用户的调用量会比较大,同时对性能有要求(甚至会担心一些groovy的误用把JVM搞挂T_T),所以在groovy集成到Java时,我们不得不关注下集成性能。
而在业界,groovy作为JVM动态语言,其中一个非常重要的应用场景,就是用在这种对用户可配置的,动态加载可热升级,对Java代码做扩展的场景中。
用groovy作为目标语言集成在Java中有这么几个优点:
a.和JAVA集成友好(需要集成到MWP-ROOUTER)
b.部署运维方便(运行在JVM上不需要其他特殊环境)
c.动态语言,用groovy构建DSL支持较好,也是业界常用的做法
d.经过一系列的优化性能上和原生JAVA接近,同时经过优化可以解决GC相关问题
e.学习接入成本低
二.坑:
Java集成Groovy有一些坑需要踩,同时在性能优化上注意的点非常多(包括执行效率、GC、Perm区、codecash等等)。而目前网上的一些文章对于性能关注的比较少,并且针对的Groovy版本都比较老,一些建议已经过时了,同时比较零碎,没有形成一个体系。
所以这里花了一些时间做了一些探索和性能测试,有了一个初步的性能优化和接入实践的方案,系统的总结一下和大家一起讨论一下,看看是否是否还有点没有考虑到位,同时因为自己也是刚接触groovy,如果哪里理解有误,欢迎大家帮忙指出。
如果没有时间看过程,可以跳到最后一步直接看结论。
三.常用集成方法:
Java集成Groovy原生有三种方法。
1通过GroovyShell类
示例代码:
系统性能:
看下面的性能截图可以发现,CPU还是有一定的使用率的(这么简单的场景),同时可以看到GC也不好,已装入的类快速上升,同时不管是堆还是Perm区的使用量都在快速增长,按照这个用法跑一会Perm区就要爆了。