0%

前言

在上文「Guava 源码分析(Cache 原理)」中分析了 Guava Cache 的相关原理。

文末提到了回收机制、移除时间通知等内容,许多朋友也挺感兴趣,这次就这两个内容再来分析分析。

在开始之前先补习下 Java 自带的两个特性,Guava 中都有具体的应用。

Java 中的引用

首先是 Java 中的引用

在之前分享过 JVM 是根据可达性分析算法找出需要回收的对象,判断对象的存活状态都和引用有关。

在 JDK1.2 之前这点设计的非常简单:一个对象的状态只有引用没被引用两种区别。

Read more »

前言

之前或多或少分享过一些内存模型对象创建之类的内容,其实大部分人看完都是懵懵懂懂,也不知道这些的实际意义。

直到有一天你会碰到线上奇奇怪怪的问题,如:

  • 线程执行一个任务迟迟没有返回,应用假死。
  • 接口响应缓慢,甚至请求超时。
  • CPU 高负载运行。

这类问题并不像一个空指针、数组越界这样明显好查,这时就需要刚才提到的内存模型、对象创建、线程等相关知识结合在一起来排查问题了。

正好这次借助之前的一次生产问题来聊聊如何排查和解决问题。

生产现象

首先看看问题的背景吧:

我这其实是一个定时任务,在固定的时间会开启 N 个线程并发的从 Redis 中获取数据进行运算。

业务逻辑非常简单,但应用一般涉及到多线程之后再简单的事情都要小心对待。

果不其然这次就出问题了。

现象:原本只需要执行几分钟的任务执行了几个小时都没退出。翻遍了所有的日志都没找到异常。

于是便开始定位问题之路。

Read more »

前言

在之前的 SpringBoot 整合长连接心跳机制 一文中认识了 Netty。

但其实只是能用,为什么要用 Netty?它有哪些优势?这些其实都不清楚。

本文就来从历史源头说道说道。

传统 IO

在 Netty 以及 NIO 出现之前,我们写 IO 应用其实用的都是用 java.io.* 下所提供的包。

比如下面的伪代码:

1
2
3
4
5
6
7
8
9
ServeSocket serverSocket = new ServeSocket(8080);
Socket socket = serverSocket.accept() ;
BufferReader in = .... ;

String request ;

while((request = in.readLine()) != null){
new Thread(new Task()).start()
}
Read more »

前言

最近有些朋友在面试阿里,加上 Java-Interview 项目的原因也有小伙伴和我讨论,近期也在负责部门的招聘,这让我想起年初那段长达三个月的奇葩面试经历🤣。

本来没想拿出来说的,毕竟最后也没成。

但由于那几个月的经历让我了解到了大厂的工作方式、对候选同学的考察重点以及面试官的套路等都有了全新的认识。

当然最重要的是这段时间的查漏补缺也让自己精进不少。

先交代下背景吧:

从去年 12 月到今年三月底,我前前后后面了阿里三个部门。

其中两个部门通过了技术面试,还有一个跪在了三面。

光看结果还不错,但整个流程堪称曲折。

下面我会尽量描述流程以及大致的面试题目大纲,希望对想要跳槽、正在面试的同学带来点灵感,帮助可能谈不上,但启发还是能有。

以下内容较长,请再次备好瓜子板凳。

Read more »

1.jpeg

前言

Google 出的 Guava 是 Java 核心增强的库,应用非常广泛。

我平时用的也挺频繁,这次就借助日常使用的 Cache 组件来看看 Google 大牛们是如何设计的。

缓存

本次主要讨论缓存。

缓存在日常开发中举足轻重,如果你的应用对某类数据有着较高的读取频次,并且改动较小时那就非常适合利用缓存来提高性能。

缓存之所以可以提高性能是因为它的读取效率很高,就像是 CPU 的 L1、L2、L3 缓存一样,级别越高相应的读取速度也会越快。

但也不是什么好处都占,读取速度快了但是它的内存更小资源更宝贵,所以我们应当缓存真正需要的数据。

其实也就是典型的空间换时间。

下面谈谈 Java 中所用到的缓存。

Read more »

前言

之前在做 秒杀架构实践 时有提到对 distributed-redis-tool 的一次小升级,但是没有细说。

其实主要原因是:

秒杀时我做压测:由于集成了这个限流组件,并发又比较大,所以导致连接、断开 Redis 非常频繁。
最终导致获取不了 Redis connection 的异常。

池化技术

这就是一个典型的对稀缺资源使用不善导致的。

何为稀缺资源?常见的有:

  • 线程
  • 数据库连接
  • 网络连接等

这些资源都有共同的特点:创建销毁成本较高

Read more »

2012/02/28

2012年二月二十八日。

这天学校举行了高考 100 天誓师大会,当时完全不知道意味着什么,只感觉现场热血沸腾、激情高涨,心里告诉自己就算只剩下 100 天我也能考上清华其次也是北大。

2012/06/03

2012年六月三日。

晚自习拿出前段时间刚拍的毕业合照,恨死摄影师,没有抓拍到我最帅的角度😡。

Read more »

photo-1522204657746-fccce0824cfd.jpeg

前言

Netty 是一个高性能的 NIO 网络框架,本文基于 SpringBoot 以常见的心跳机制来认识 Netty。

最终能达到的效果:

  • 客户端每隔 N 秒检测是否需要发送心跳。
  • 服务端也每隔 N 秒检测是否需要发送心跳。
  • 服务端可以主动 push 消息到客户端。
  • 基于 SpringBoot 监控,可以查看实时连接以及各种应用信息。

效果如下:

show

Read more »

alarm-clock-art-background-1037993.jpg

前言

首先标题党一下,其实这篇文章主要是记录我的第二个过 1K star 的项目 Java-Interview,顺便分享下其中的过程及经验。

4.png

需求选择

Java-Interview

之所以要做这个项目主要是当时我正在面阿里的两个部门,非常幸运的是技术面都过了。其中的过程真是让我受益匪浅更是印象深刻,所以就想把期间的问题记录下来,加上自己的理解希望能对其他朋友起到帮助。

正好那段时间也是传说中的金三银四,所以无形中也叫顺势而为吧😏。

Read more »

前言

之前在 Java-Interview 中提到过秒杀架构的设计,这次基于其中的理论简单实现了一下。

本次采用循序渐进的方式逐步提高性能达到并发秒杀的效果,文章较长请准备好瓜子板凳(liushuizhang😂)。

本文所有涉及的代码:

最终架构图:

系统架构设计.png

Read more »