
【Java】
_laomei_
Debezium Contributor;
Schema Registry Contributor;
flink大数据、微服务体系开发;
展开
-
log4j2 大日志导致占用内存过多问题
代码里有频繁的日志打印,并且会打印大对象,单条日志较大,导致jvm被大量日志对象占用。LOG4J2-1858log4j2在2.9.0版本代码org.apache.logging.log4j.message.ParameterizedMessage@Overridepublic String getFormattedMessage() { if (formattedMessage == null) { final StringBuilder buffer = getThrea原创 2021-04-13 10:55:06 · 8131 阅读 · 0 评论 -
Java 代码解析 maven pom.xml 文件
在某些情况下需要使用java代码解析pom.xml文件。使用方式如下maven依赖<dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-model</artifactId> &原创 2018-12-27 17:38:03 · 7510 阅读 · 1 评论 -
Java 代码调用 Maven 命令
某些情况下,需要通过Java代码来调用maven命令,可以依据以下的方式来做到maven依赖<dependency> <groupId>org.apache.maven.shared</groupId> <artifactId>maven-invoker</artifactId&原创 2018-12-27 17:39:45 · 5084 阅读 · 1 评论 -
Java 代码解析 mvn dependency tree 结果
com.qunhe.middleware:audit-client:jar:0.2.4.RELEASE+- org.projectlombok:lombok:jar:1.16.18:compile+- org.springframework.cloud:spring-cloud-starter-feign:jar:1.3.5.RELEASE:compile| +- org.springfr...原创 2018-12-27 17:49:14 · 4485 阅读 · 1 评论 -
Java 使用 JGit 执行 Git 命令
某些时候需要使用Java代码执行Git操作,可以使用JGit来实现。<dependency> <groupId>org.eclipse.jgit</groupId> <artifactId>org.eclipse.jgit</artifactId> <version>4.9.3.20180731100...原创 2018-12-27 18:00:52 · 6531 阅读 · 4 评论 -
aspectj 和 lombok
前段时间要做一个本地方法调用链工具,显示方法耗等。为了竟可能的不影响性能,所以采用了aspectj 编译期织入的方式,记录一些数据。aspectj 编译期织入需要特殊的compiler,要额外添加maven plugin。代码写的差不多,能够满足需求了。然后随便找了个项目一试,发现aspectj 竟然和lombok不能一起工作,aspectj编译期会提示找不到 lombok 生成的那些方法。因为...原创 2019-01-13 14:25:59 · 1783 阅读 · 0 评论 -
@KafkaListener注解解密
本文会介绍一下@KafkaListener的工作流程,但是不会详细深入。@KafkaListener 如何使用spring-kafka使用基于@KafkaListener注解,@KafkaListener使用方式如下@KafkaListener(topics = "xxx")public void testListen(List<ConsumerRecord<xxx, xxx&...原创 2019-01-31 14:14:10 · 22261 阅读 · 4 评论 -
JVM基础知识和ASM修改字节码
本文会介绍一下ASM的简单使用和一些JVM相关的知识,但是不会很详细的涵盖所有内容。为了方便理解,我会分别介绍以下内容JVM基础知识Java字节码基础知识ASM基础使用JVM 基础知识因为字节码中的指令执行和JVM相关,所以需要先介绍一下JVM基础知识。JVM 虚拟机栈对Java稍有了解的开发人员,应该都知道JVM有一个Java虚拟机栈,栈中的每一个元素被称为Frame(栈帧)...原创 2019-03-04 14:02:11 · 3515 阅读 · 2 评论 -
中间件和业务类加载隔离
Overview我对类隔离简单的理解:在一个应用内,有类名为clazz,模块A使用了clazz,模块B也使用了clazz。模块A不会用到模块B ClassLoader加载的clazz,模块B不会用到模块A ClassLoader加载的clazz。例如下图,App用到的中间件依赖了ClassA,App也依赖了ClassA。通过类隔离后,App不会使用用中间件依赖的ClassA,中间件不会使用...原创 2019-04-03 15:33:40 · 1338 阅读 · 1 评论 -
mac 安装多个版本的 jdk
最近打算研究一下elasticsearch,看一下某些代码实现,于是拉了一下代码。吼,这个项目还真是大,拉代码就挺久。然后用idea打开,发现master竟然要jdk 11,切到6.5分支竟然也要jdk 10,自己的电脑装的是jdk8,瞬间感觉有点xxx。于是查了一下mac下怎么配置多个jdk。准备工作如果没有homebrew,先装一下homebrew。第一步brew install je...原创 2019-05-08 14:56:00 · 1590 阅读 · 0 评论 -
java spi实现原理
java spi内部实现也是基于ClassLoader机制。java spi核心类是ServiceLoader,现在看它的实现逻辑;ServiceLoader内部含有一私有类LazyIterator,继承Iterator,封装了spi具体实现。private class LazyIterator implements Iterator<S>{ Class<S>...原创 2018-10-15 10:25:10 · 1377 阅读 · 0 评论 -
java spi
容器希望中间件只提供相关的connector依赖给业务方使用,而不是具体的实现。通过connector带来的好处就是,中间件升级jar包,不会影响业务方的使用,业务方对其无感知。并且业务代码里也不会引入多于的jar包,导致不必要的jar冲突。Java 6 has introduced a feature for discovering and loading implementations m...原创 2018-10-15 10:24:53 · 252 阅读 · 0 评论 -
java 加载指定目录下的jar包(自定义ClassLoader)
自定义的class,打成jar包放在/opt下package com.laomei.test;public class HelloWorld { public void hello() { System.out.println("hello"); }}构造自定义URLClassLoaderpublic class MyClassLoader exte...原创 2018-10-15 10:24:02 · 6635 阅读 · 0 评论 -
Class.forName 和 .class
使用类而做的工作步骤加载, 由类加载器执行链接, 为静态域分配存储空间等初始化,初始化、执行静态初始化器和静态初始化块Class.forName它获取对制定类的Class对象的引用,会进行初始化。public class P { static { System.out.println("Hi"); }}测试代码:public class TestP {原创 2017-04-09 21:08:53 · 456 阅读 · 0 评论 -
Java 反射创建对象
public class Toy { private int i; public Toy() {} public Toy(int i) { this.i = i; } public int getI() { return i; } public int getValue(int val) { return val; }原创 2017-04-09 23:00:38 · 684 阅读 · 0 评论 -
Java 使用Executors创建线程池
1.newCachedThreadPool: 返回一个缓存线程池; 如果处理的任务超过线程池中的线程数,并且没有可用的线程时,线程池会创建一个新的线程给一个任务。它会回收旧的线程,为之后使用。ExecutorService service = Executors.newCachedThreadPool();2.newFixedThreadPool: 固定大小的线程池。线程池内线程的数目是固定的,如果原创 2017-03-16 13:04:10 · 518 阅读 · 0 评论 -
Java8 Lambda表达式
从下面的例子入手类Clazz:class Clazz { private Integer x; public Clazz(Integer x) { this.x = x; } public Integer getX() { return x; } public void setX(Integer x) { th原创 2017-04-29 16:47:14 · 356 阅读 · 0 评论 -
Java多线程的join和interrupt方法
Java的join()官方的解释: Waits for this thread to die.等待当前线程直到当前线程结束。假设现在有A、B,线程A在线程B内调用A.join(),那么线程B会被挂起,直到A线程完成后才恢复。比如线程没有使用joinpublic class TestJoin { public static void main(String[] args) throws原创 2017-04-14 21:50:20 · 632 阅读 · 0 评论 -
executor.invokeAll和Future.get指定限制时间
设定时间的任务如果某一个子线程任务不能在规定的时间内完成,那么应该抛弃该任务,不再需要其结果,同时中断该任务,减少性能开销。Future.get方法有一个重载,传入限制的时间V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException;如果阻塞时长超过指原创 2017-05-12 21:03:37 · 2313 阅读 · 0 评论 -
getDeclaredConstructor() 与 getConstructor()方法
getConstructor()返回指定参数类型public的构造器。 getDeclaredConstructor()返回指定参数类型的private和public构造器。对于getDeclaredConstructor方法获得的构造器需要先设置可访问,在实例化对象。public class Test { public Test() { System.out.printl原创 2017-04-25 23:06:53 · 8622 阅读 · 0 评论 -
使用Freemarker解析占位符,构造可执行的SQL语句
背景最近遇到一个需求, 框架需要执行用户给定的SQL语句,该SQL语句内包含占位符, 占位符表示的内容存在于在框架中,比如下面的sqlselect * from xxx where id = ${xxid}xxid值存在于框架中,也就是说框架需要解析用户设置的sql,将占位符用框架内的值替换。众所周知,Mybatis能够解析占位符,执行SQL语句, 但是由于sql语句由用户传入,不是写在xml或My原创 2017-07-22 21:33:33 · 6480 阅读 · 0 评论 -
native2ascii转码
一个例子 native2ascii -encoding utf-8 mess.properties mess.properties第二、三个参数-encoding uft-8表示需要转换成的编码,第四个参数表示目标文件。 第四个参数转码后的值存放的文件。 如果第五个参数不存在,则向控制台输出。原创 2017-03-12 15:41:56 · 306 阅读 · 0 评论