This website requires JavaScript.

《深入理解Java虚拟机》中一题引发的思考

1 - 引言

在阅读『深入理解Java虚拟机(第3版)』时看到里面的一道代码题目,书中给出了题目的解答。自己对于这个题目拓展的想了几个变式,结果有所差异,为了寻找产生差异的原因又深入了解了一番。

2 - 类初始化时机

2.1 - 原题

在『深入理解Java虚拟机(第3版)』的7.2章节 "类加载的时机",其代码清单7-1有这么一段代码:

public class SuperClass {
    static {
        System.out.println("SuperClass init!");
    }

    public static int VALUE = 1;
}

public class SubClass extends SuperClass {
    static {
        System.out.println("SubClass init!");
    }
}

public class Main {

    public static void main(String[] args) {
        System.out.println(SubClass.VALUE);
    }
}
Read more

Service调用其他Service的private方法, @Transactional会生效吗(下)

前情提要:

Service调用其他Service的private方法, @Transactional会生效吗(上)中证明了动态代理不会代理private方法的, 并通过阅读源码证实了.

但是我们可以自己实现一个动态代理功能替代Spring Boot中原有的, 达到动态代理private方法的目的.

主要流程为:

  1. 重新实现一个ProxyGenerator.generateClassFile()方法, 输出带有private方法的代理类字节码数据
  2. 把字节码数据加载到JVM中, 生成Class
  3. 替代Spring Boot中默认的动态代理功能, 换成我们自己的动态代理.
Read more

Service调用其他Service的private方法, @Transactional会生效吗(上)

省流大师:

  1. 一个Service调用其他Service的private方法, @Transactional会生效吗

  2. 正常流程不能生效

  3. 经过一番操作, 达到理论上可以

本文基于Spring Boot 2.3.3.RELEASE、JDK1.8 版本, 使用Lombok插件

Read more

打造优雅的Windows开发环境

使用Scoop管理安装包

Scoop安装和配置

https://scoop.sh/

PowerShell执行

# 权限允许
Set-ExecutionPolicy RemoteSigned -scope CurrentUser

# 执行安装脚本
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.sco
Read more

惨遭DruidDataSource和Mybatis暗算,导致OOM

先遭DruidDataSource袭击

事发

一个平凡的工作日,我像往常一样完成产品提出的需求的业务代码,突然收到了监控平台发出的告警信息。本以为又是一些业务上的bug导致的报错,一看报错发现日志写着java.lang.OutOfMemoryError: Java heap space

接着我远程到那台服务器上,但是卡的不行。于是我就用top命令查了一下cpu信息,占用都快要到99%了。再看看GC的日志发现程序一直在Full GC,怪不得cpu占用这么高。

这里就推测是有内存泄漏的问题导致GC无法回收内存导致OOM。为了先不影响业务,就先让运维把这个服务重启一下,果然重启后服务就正常了。

Read more