跳至主要內容
arthas特殊用法

官方issue中提供的特殊用法:https://github.com/alibaba/arthas/issues/71

idea插件:arthas idea

mvc项目获取spring配置

watch org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod '{target.getApplicationContext().getEnvironment().getProperty("spring.datasource.url")}'  -n 5  -x 3

DHB小于 1 分钟JavaArthas
Spring Gateway堆外内存溢出问题定位

公司使用Spring Gateway作为业务网关,一直存在一个堆外内存泄露的疑难杂症。从同事手上接手过来后最终解决了这个问题。


DHB大约 3 分钟JavaSpringSpring Gateway
apisix基于docker开发java插件

环境准备

apisix不支持windows,加上apisix的runner插件使用的协议不支持windows,所以需要在Linux环境下开发,有两个选择

  1. 使用Linux服务器部署apisix,通过ssh远程开发
  2. 使用windows + wsl2,本地开发【推荐】

两种方案IDEA都支持

使用docker快速搭建开发环境

git clone https://github.com/apache/apisix-docker.git

DHB大约 7 分钟JavaApisixJava
Jedis cluster模式连接出现No more cluster attempts left

同事在测试环境jedis cluster模式出现redis.clients.jedis.exceptions.JedisClusterMaxAttemptsException: No more cluster attempts left.报错,找到我帮忙定位下问题

通过堆栈信息找到对应的源码位置redis.clients.jedis.JedisClusterCommand#runWithRetries


DHB小于 1 分钟JavaJavaJedisRedis
海豚调度连接Zookeeper超时定位

过程

在本地启动海豚调度的服务,出现zookeeper connect timeout异常,但是检查zookeeper节点都是正常的。经过一轮分析,发现个大坑!!!

海豚调度的zookeeper配置信息:

#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

registry.plugin.name=zookeeper
registry.servers=x.x.x.x:2181
registry.namespace=dolphinscheduler
registry.base.sleep.time.ms=60
registry.max.sleep.ms=300
registry.max.retries=5
registry.session.timeout.ms=30000
registry.connection.timeout.ms=7500
registry.block.until.connected.wait=600
registry.digest=

DHB大约 5 分钟Java问题排查海豚调度Zookeeper
生产tomcat线程阻塞问题分析

现象

当大量的请求到服务,过一会,服务无法响应请求,k8s配置了健康检查,服务被k8s重启

分析

让运维的同学把thread和heap dump了下来,打开一看,全部tomcat的线程阻塞在Druid连接池上

线程情况

image-20230329092255788_1

所有的tomcat线程堵塞在com.alibaba.druid.pool.DruidDataSource.takeLast,该方法是从Druid的连接池取出连接,当线程池没有空闲的时候,一直阻塞等待。


DHB大约 1 分钟Java问题排查Druid
ArraysSupport#mismatch

前言

在研究elasticsearch排序插件的时候,自研的排序算法产生的数值远远大于64位数字的最大值,所以只能选择字符串排序。

字符串数字排序

字符串是按ASCII编码排序的,对于数字排序是存在问题的。比如有一下这些数字字符串:1、2、4、12、3,排序的结果就是1、12、2、3、4。这不符合数字排序的预期,这也正是原先在做solr的时候没有选择字符串排序的原因。在查询资料的时候,找到这个贴子 https://discuss.elastic.co/t/sorting-a-string-field-numerically/9489/7 其中提供了一种方法:把数字的位数追加到原数字的前面,追加的数字需要有占位符,比如已知最长的位数不超过100,追加的数字就是有两位,01、02、12这样。为什么需要这样呢?因为在对比字符串的原理是从0下标开始取出字符做对比,先取出位数做对比就能解决数字字符串排序的问题。


DHB大约 4 分钟Java算法
动态编译技术
com.sun.tools.javac.jvm.ClassWriter#writeClass 把字节码写出到OutputStream中

编译过程

java文件-> JCCompilationUnit(类) -> 注解处理器 -> 写出class文件

JCCompilationUnit生成

语法树生成


DHB大约 2 分钟Java动态加载编译
简化Mapstruct使用-mapstruct-helper

简化mapstruct使用,灵感来源Spring Ioc。

使用方法


<dependency>
    <groupId>cn.dhbin</groupId>
    <artifactId>mapstruct-helper-core</artifactId>
    <version>1.0.0</version>
</dependency>

DHB大约 2 分钟JavaMapstruct
简单几步!Windows下Clion结合docker调试openjdk8源码

废话不多说,开干!

原理是通过Docker编译openjdk,然后结合clion通过gdbserver远程调试

环境需求

  • Clion
  • Docker

我测试的版本

Docker for windows : Docker version 20.10.2, build 2291f61

Clion : 2020.3.1

构建镜像

git clone https://e.coding.net/javalistcn/openjdk/build-openjdk-8.git
cd  build-openjdk-8
docker build -t build-openjdk-8 .

DHB大约 2 分钟Java源码