解决 JVM 异常栈丢失问题
JVM 默认情况下,当代码的某一个位置高频率抛出同一异常时,为了节约性能,JVM 会对以下异常类型的异常栈进行优化,不再打印完整异常栈。
NullPointerException
ArithmeticException
ArrayIndexOutOfBoundsException
ArrayStoreException
ClassCastException
往往出现这种情况,只能期望找到最初报错的日志,去找到具体的异常行。
除此之外,我们可以通过指定 OmitStackTraceInFastThrow 这个 JVM 参数去关掉这个优化,仅需要在应用启动参数中添加如下即可:
1-XX:-OmitStackTraceInFastThrow
这个参数对于大部分类型的 JVM 都是适用的,已在 HotSpot 和 Zing上验证可行,可以点击这里查询各厂商 JVM 参数列表。
在 IDEA 中的话,配置如下即可:
另外需要注意的是,不加控制的打印异常栈,对 CPU 和内存都会有影响。最好在出现异常后尽快解决,或对异常打印增加频率控制。总之就是这个思想,懂就行。
Java 并发编程——CompletableFuture
一、前言
本文向大家安利一下 JDK 8 中的并发工具类 CompletableFuture,利用它可以方便的进行并发、异步的流式、协调操作。自从用了它,一下次就不想用 CountdownLatch 和 Future 了,赶紧一起来了解下吧。
二、实例化
CompletableFuture 提供了两组静态方法来实例化出对象,如下所示。
12345CompletableFuture.runAsync(Runnable runnable);CompletableFuture.runAsync(Runnable runnable, Executor executor);CompletableFuture.supplyAsync(Supplier<U> supplier);CompletableFuture.supplyAsync(Supplier<U> supplier, Executor executor)
runAsync() 方法接收的是 Runnable 实例,用于异步任务不需要返回值的情况
supplyAsync() 方法接受的是 Supplier 实 ...
Slf4j 包冲突问题原因与解决
一、前言
在进行 Java 开发时,通常我们会选择 Slf4j 作为日志门面,但日志实现却不尽相同。如果系统运行中同时存在多个日志实现,就会出现类似下图的 Warning。
二、问题原因
我们知道 SpringBoot 默认使用的日志实现是 Logback,因此我们尝试在项目中引入 Log4j 的依赖时,就复现了上图的报错。
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId></dependency>
上图报错告知我们存在多个 SLF4J bingdings,分别位于 logback 和 log4j 包中,有两个 StaticLoggerBinder。
我们知道使用 Slf4j ,需要 LoggerFactory.getLogger() 方法获取实例。
1234import org.slf4j.Logger;import o ...
SpringBoot Metrics 监控系统(4)——使用指标
一、前言
在正式讲解之前,我们先把上一节缺省的地方补齐。
1.1 枚举类实现
IMetricsEnum 和 IMetricsTagEnum 均为接口定义,下面我直接给出它们的实现类。具体的每个指标含义下面会详细讲解。
1234567891011@Getter@AllArgsConstructorpublic enum MetricsEnum implements IMetricsEnum { READ_COUNT("read_count", Type.COUNTER, "阅读量统计"), VISITOR_SIZE("visitor_size", Type.GAUGE, "访问量统计"), REQUEST_TIME("request_time",Type.TIMER, "请求耗时"); private final String name; private final Type type; private final St ...
SpringBoot Metrics 监控系统(3)——搭建框架
一、前言
本章节开始将为大家展示如何在 SpringBoot 应用中去使用 Metrics 监控。本系列使用的 SpringBoot 版本为笔者当前的最新 RELAESE 版本 2.4.0,整个 SpringBoot 2 关于这边都是大同小异,所以大家不用担心版本问题。
二、依赖包
除了常规开发 SpringBoot Web 所需要的两个包外:
123456789<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency> ...
SpringBoot Metrics 监控系统(2)——快速起步
一、Docker
首先需要安装 Docker,已经安装的朋友直接跳过该节即可。
Docker 最近新出了 Docker Desktop,可以对容器和镜像可视化管理,还是很不错的。访问官网
下载即可,这里我使用 Windows 平台进行安装。【最好采用科学上网,否则速度会很感人】
如果安装完毕后打开报下图的错,需要在更新下 WSL2,点此下载。
启动成功后如下图所示:
二、Prometheus + Grafana
打开 PowerShell 或其他命令行工具,下载镜像:
1docker pull prom/prometheus
下载完毕后,提前准备好配置文件,新建配置文件 prometheus.yml,内容如下。将其保存到任一位置即可,并记录下它的绝对路径。我这里把它放置在了桌面,因此它的绝对路径是:C:\Users\Jitwxs\Desktop\prometheus.yml。
12345678910global: scrape_interval: 60s evaluation_interval: 60s scrape_configs: - job_name: p ...
SpringBoot Metrics 监控系统(1)——技术介绍
一、前言
本系列将为大家介绍如何对我们的 SpringBoot 应用程序进行监控和告警,使用的技术为 Prometheus + Grafana。二者均采用 Docker 进行安装部署,实际工作中自己在生产环境搭建的可能性不大,因此我们关注的重点放在如何使用就好了。
二、Prometheus
Prometheus 是 Soundcloud 开发的一款开源的监控工具,其本质是一个时间序列数据库(TSDB),采用 Go 语言开发。
它具有以下特点:
多维度:我们可以给指标数据添加多组标 Label,在展示时候可以作为筛选条件灵活选择。
拉模式:Prometheus 采用 Pull 模式,我们的指标数据生成后,Prometheus 会主动来消费,我们不需要做额外操作。
白盒&黑盒监控均支持:无论什么维度的指标数据,都可以采集到,对 DevOps 友好。
Metrics & Alert:Prometheus 采集的是 Metrics 指标,而不是 logging 和 tracing。
社区生态丰富:支持各种语言的客户端,并且有各种各样的 exporters,来实现黑盒监控 ...
使用 Fiddler 进行模拟器抓包
Fiddler 是一款比较常用的网络抓包工具,本文记录下使用其完成对模拟器中请求进行抓包的过程。
点击链接 官网下载 Fiddler,可能需要翻墙。下载完毕后,常规安装并登录后打开应用。
点击右上角⚙图标,进入设置页面
选择 HTTPS 选项卡,点击 Trust root certficarte ,获取 root 权限。获取完毕后,勾选下方复选框,以支持对 HTTPS 协议的请求。
展开 Advanced Settings,将 .crt 证书导出至桌面,后续需要在模拟器中安装。
选择 Connections 选项卡,可以指定监听端口,直接使用默认的 8866 即可。
勾选下方 Allow remote computers to connect,我们的模拟器才能连接上来。
至此完成 Fiddler 侧设置,下面安装模拟器。随便选择一家模拟器即可,我这里使用夜神模拟器进行演示。
确认模拟器开启了 root,我这里默认就已经是开启状态了。
进入系统 WLAN 设置中,鼠标左键长按已连接的 wifi,在弹出菜单中选择 修改网络。
展开 高级选项,将 代理 设置为 ...
如何优雅的统计代码耗时
一、前言
代码耗时统计在日常开发中算是一个十分常见的需求,特别是在需要找出代码性能瓶颈时。
可能也是受限于 Java 的语言特性,总觉得代码写起来不够优雅,大量的耗时统计代码,干扰了业务逻辑。特别是开发功能的时候,有个感受就是刚刚开发完代码很清爽优雅,结果加了一大堆辅助代码后,整个代码就变得臃肿了,自己看着都挺难受。因此总想着能不能把这块写的更优雅一点,今天本文就尝试探讨下“代码耗时统计”这一块。
在开始正文前,先说下前提,“代码耗时统计”的并不是某个方法的耗时,而是任意代码段之间的耗时。这个代码段,可能是一个方法中的几行代码,也有可能是从这个方法的某一行到另一个被调用方法的某一行,因此通过 AOP 方式是不能实现这个需求的。
二、常规方法
2.1 时间差统计
这种方式是最简单的方法,记录下开始时间,再记录下结束时间,计算时间差即可。
12345678910111213public class TimeDiffTest { public static void main(String[] args) throws InterruptedException ...
Mac 安装 brew
一、前言
brew 是 Mac 和 Linux 下的包管理器,但是需要手动安装,在国内操蛋的网络环境下,想要不翻墙安装,还得花点功夫。本文记录在非翻墙情况下,如何安装 brew。
二、安装流程
2.1 官方步骤
1/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
以上为官方推荐的安装步骤,但是如果你没有开翻墙的话,大概率是会失败的。
2.2 国内镜像-1
可以使用以下命令,傻瓜操作。但是很遗憾我的电脑用不了,一直提示没有文件权限。
1/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
2.3 国内镜像-2
这个方法在本机上能够成功安装、
1/usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo ...