1. 1 无处安放 汪峰
  2. 2 平凡之路 朴树
  3. 3 往后余生 马良
  4. 4 牧马城市 毛不易
无处安放 - 汪峰
00:00 / 00:00

词:汪峰

曲:汪峰

我闻到初春的味道

那如同儿时梦境新鲜的芬芳

也尝到思念的苦涩

这回望远方秋雨般无垠的萧索

心爱的人啊

多年以后是否还记得我的惦念

我的忧愁和挣扎

你知不知道

没有你我那颗叮叮当当的心啊

总是这样 这样无处安放

我去到来时的路上

还是那躺在公路尽头的月亮

电台里放着披头士

可那在我身旁熟睡的你在哪里

思念的人啊

人们常说时间会让爱变得淡忘

变得模糊和破碎

可你知不知道

没有你我那颗叮叮当当的心啊

总是这样 这样无处安放

回望这纷乱的生活

有太多人在我心底匆匆掠过

可当我想念的时候

却只有你让我静静地流下眼泪

心爱的人啊

时光飞逝我们终究要渐渐老去

渐渐恐惧和放弃

可你知不知道

没有你我那颗叮叮当当的心啊

终将这样 这样无处安放

终将这样 这样无处安放

Clay 的技术空间

用进废退 | 艺不压身

大纲

JVM 简单介绍

JVM 内存结构

JVM 内存结构主要有三大块:栈、堆内存、方法区。堆内存是 JVM 中最大的一块。方法区存储类信息、静态变量、常量、常量池等数据,是线程共享的区域,为了与 Java 堆区分,方法区还有一个别名 Non-Heap (非堆)。栈又分为 Java 虚拟机栈和本地方法栈,主要用于方法的执行。

阅读全文 »

SpringBoot 3 版本

2022 年 11 月 24 日,SpringBoot 3.0 正式发布了。此版本包含了 12 个月以来 151 个人的 5700 多次 Commit 的工作结晶。这是自 4.5 年前发布 2.0 以来,Spring Boot 的第一次重大修订。它也是第一个支持 Spring Framework 6.0 和 GraalVM 的 Spring Boot GA 版本。

新变化

  • 支持响应式编程
  • 支持 Spring Framework 6.0
  • 支持 GraalVM native images
  • Spring 自身与第三方包版本升级
  • 最低支持 JDK 17,最高支持 JDK 19
  • 从 Java EE API (Javax) 迁移到 Jakarta EE API
  • 自动配置的包位置变化
    • 旧版本: META-INF/spring.factories
    • 新版本: META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
阅读全文 »

大纲

前言

性能指标

  • RT (Response Time):用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。
  • HPS (Hits Per Second):每秒点击的次数,单位是次 / 秒。
  • TPS (Transaction per Second):系统每秒处理交易 (事务) 的笔数,单位是笔 / 秒。
  • QPS (Query per Second):系统每秒处理查询的次数,单位是次 / 秒。
阅读全文 »

大纲

前言

本文主要介绍 Java 的五种代理实现方式,包括 JDK 动态代理、Cglib、ASM、Javassist、Byte Buddy,点击 下载完整的案例代码。

准备工作

先定义出一个接口和相应的实现类,方便后续使用代理类在方法中添加日志信息。

  • 接口
1
2
3
4
5
public interface IUserApi {

String queryUserInfo();

}
阅读全文 »

大纲

静态代理的介绍

静态代理是 Java 中的一种设计模式,用于为目标对象提供额外的功能或控制访问目标对象的操作。它的基本思想是通过创建一个代理类,代理类具有与目标对象相同的接口或方法,并在代理类的方法中调用目标对象的对应方法。代理类可以在调用目标对象方法的前后添加额外的逻辑,比如权限检查、日志记录、事务处理等。

阅读全文 »

估算算法

第一种估算算法

先来一个天真的估算算法:假设要求一个系统的 TPS(Transaction Per Second 或者 Task Per Second)至少为 20,然后假设每个 Transaction 由一个线程完成,继续假设平均每个线程处理一个 Transaction 的时间为 4s。那么问题可以转化为:如何设计线程池大小,使得可以在 1s 内处理完 20 个 Transaction?这里计算过程可以很简单,每个线程的处理能力为 0.25TPS,那么要达到 20TPS,显然需要 20/0.25=80 个线程。

很显然这个估算算法很天真,因为它没有考虑到 CPU 数目。一般服务器的 CPU 核数为 16 或者 32,如果有 80 个线程,那么肯定会带来太多不必要的线程上下文切换开销。

第二种估算算法

第二种估算算法比较简单,但不知是否可行(N 为 CPU 总核数):

  • 如果是 CPU 密集型应用,则线程池大小设置为 N+1
  • 如果是 IO 密集型应用,则线程池大小设置为 2N+1

如果一台服务器上只部署这一个应用并且只有一个线程池,那么这种估算或许合理,具体还需自行测试验证。

阅读全文 »

前言

本文主要介绍如何检测 Java 代码规范与格式化 Java 代码,包括 IDEA 插件与 Maven 插件的使用。

代码规范检测插件

IDEA 代码规范检测插件

IDEA 可以使用 CheckStyle-IDEA 插件来检测 Java 代码的规范,它可以保证每位提交者的代码规范都保持一致。值得一提的是,CheckStyle-IDEA 插件只能检测代码的规范,并不能格式化代码。

创建规则文件

在项目中创建 checkstyle.xml 规则文件,例如路径为 config/checkstyle/checkstyle.xml

提示

  • 1、CheckStyle 的版本与 checkstyle.xml 规则文件的内容必须互相匹配,否则会影响代码规范检测插件 CheckStyle-IDEA 的正常运行。
  • 2、Alibaba Nacos 项目的 CheckStyle 规则文件可以从 GitHub 获取,详细的使用说明请看 官方文档
  • 3、Google 的 CheckStyle 规则文件可以从 GitHub 获取。
  • 4、Spring 的 CheckStyle 规则文件可以从 GitHub 获取。
  • Alibaba Nacos 的 CheckStyle 规则文件如下,要求 CheckStyle 的版本至少为 8.30
阅读全文 »

前言

本文将介绍 VuePress 如何渲染 Mermaid 绘图,适用于 VuePress 1.x 与 VuePress 2.x。

VuePress 1.x

VuePress 1.x 可以直接安装第三方插件 vuepress-plugin-mermaidjs 来渲染 Mermaid 绘图,插件的详细文档可看 这里

安装插件

安装插件时必须指定具体的版本号,否则默认会安装最新版本的插件,最新版本不兼容 VuePres 1.x。

1
$ npm install vuepress-plugin-mermaidjs@1.9.1 -D

配置插件

编辑 VuePress 1.x 的 .vuepress/config.js 配置文件,新增 mermaidjs 插件,如下所示:

1
2
3
4
5
module.exports = {
plugins: [
'vuepress-plugin-mermaidjs'
]
}
阅读全文 »

前言

Docker 镜像说明

本文使用了 DockerHub 平台上的 Oracle 11g 镜像,基于 Ubuntu 18.04 LTS 系统,数据库版本是 Oracle Express Edition 11g Release 2 (11.2.0.2.0)。

Oracle 各版本介绍

在 Oracle 数据库的发展中,数据库一直处于不断升级状态,一共有以下几个版本:

  • Oracle 8i:Oracle 8i 表示 Oracle 正式向 Internet 上发展,其中 i 表示就是 internet。
  • Oracle 9i:Oracle 8i 是一个过渡版本,Oracle 9i 是一个更加完善的数据库版本。
  • Oracle 10g:g 表示 grid,代表网格的意思,即这种数据库采用网格计算的方式进行操作。
  • Oracle 11g:是 Oracle 10g 的稳定版本,Oracle 11g 是目前使用最广泛的版本。
  • Oracle 12c:是 Oracle 2013 年推出的数据库版本,c 代表 Cloud,代表云计算的意思,同时 Oracle 12c 支持大数据的处理能力。
  • Oracle 18c、Oracle 19c 是对 12c 版本的完善和发展。
阅读全文 »

大纲

算法

算法的基本概念

算法的简介

函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。而 C++ 通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL 就利用了这一点提供了相当多的算法。它是在一个有效的框架中完成这些算法的 —— 可以将所有的类型划分为少数的几类,然后就可以在模板的参数中使用一种类型替换掉同一种类中的其他类型。

阅读全文 »