如何利用日志链路追踪程序执行的慢 SQL?

2021-12-21
阅读 3 分钟
2.2k
系统都是逐渐演进的,一个系统在运行中必须是根据场景逐渐地提高优化性能。高并发就是对资源的节约的考验,这种考验除了更换优秀和先进的技术,优化架构,还在于从小处出发,对尽可能节约的资源进行节约。
封面图

微服务架构 | 如何利用好日志链路追踪做性能分析?

2021-12-14
阅读 3 分钟
1.2k
导读:做性能分析听到最多的歪理就是,服务做水平、垂直扩容、分表分库、读写分离、XX中间件、资源静态化等等但是归根到底这些方案都是为了尽可能减少对数据库的访问以及堆栈的释放,提高数据库IO的读写速度和程序的运行效率。
封面图

对象在内存中的内存布局是什么样的?

2021-07-26
阅读 3 分钟
3k
一个Java对象的存储结构。在Hotspot虚拟机中,对象在内存中的存储布局分为 3 块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)
封面图

稍等,我手机帮你远程调试下代码!

2021-07-19
阅读 2 分钟
1.7k
目前市面上远程办公软件各式各样,但是Teamviewer可能是陪伴我们最早的远程办公软件了,最开始实习想查看公司电脑的备份资料、代码等一些加密文件(公司统一配置电脑并且加密处理)。Teamviewer 确实陪伴了我一段很长的时间。到了后来用Teamviewer主要是为了解决线上问题,因为阿里云线上服务器设置的白名单只有公司那几个...
封面图

架构上如何设计领域模型和数据模型?

2021-07-16
阅读 3 分钟
4.6k
依稀记得我第一次设计一个系统的时候,画了一堆UML(Unified Modeling Language,统一建模语言)图,面对Class Diagram(其实就是领域模型),纠结了好久,不知道如何落地。因为,如果按照这个类图去落数据库的话,看起来很奇怪,有点繁琐。可是不按照这个类图落库的话,又不知道这个类图画了有什么用。
封面图

如何规范你的Git commit?

2021-04-23
阅读 2 分钟
1.4k
导读:commit message应该如何写才更清晰明了?团队开发中有没有遇到过让人头疼的git commit?本文分享在git commit规范建设上的实践,规定了commit message的格式,并通过webhook在提交时进行监控,避免不规范的代码提交。

MySQL什么时候才考虑分表分库?

2021-03-19
阅读 3 分钟
2.8k
并不是所有表都需要进行切分,主要还是看数据的增长速度。切分后会在某种程度上提升业务的复杂度,数据库除了承载数据的存储和查询外,协助业务更好的实现需求也是其重要工作之一。

重磅:Java 16 正式发布了!

2021-03-18
阅读 5 分钟
1.7k
2020 年是值得纪念的一年,这一年中我们庆祝了 Java 的 25 岁生日。经过二十多年的持续创新,Java 一直在:通过适应不断变化的技术格局来保持灵活性,同时维持平台独立性。通过保持向后兼容性来保证可靠性。在不牺牲安全性的前提下加速创新来保持优势。Java 凭借自身不断提高平台性能、稳定性和安全性的能力,一直是开发...

MySQL 要分表分库怎么进行数据切分?

2021-03-16
阅读 3 分钟
1.9k
数据库分布式核心内容无非就是数据切分(Sharding)以及切分后对数据的定位、整合。数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。

Kafka 中所谓的 ‘零拷贝’ 技术到底是什么?

2021-02-26
阅读 2 分钟
5.4k
除了消息顺序追加、页缓存等技术,Kafka 还使用零拷贝技术来进一步提升性能。所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。对 Linux 操作系统而言,零拷贝技术依赖于底层的 sendfile() 方法实现。对应于 J...
封面图

Kafka 是怎么存储的?为什么速度那么快?

2021-02-24
阅读 3 分钟
3k
Kafka 依赖于文件系统(更底层地来说就是磁盘)来存储和缓存消息。在我们的印象中,对于各个存储介质的速度认知大体同下图所示的相同,层级越高代表速度越快。很显然,磁盘处于一个比较尴尬的位置,这不禁让我们怀疑 Kafka 采用这种持久化形式能否提供有竞争力的性能。在传统的消息中间件 RabbitMQ 中,就使用内存作为默...
封面图

深入理解Java虚拟机是怎么实现synchronized的?

2021-02-23
阅读 5 分钟
1.3k
在 Java 程序中,我们可以利用 synchronized 关键字来对程序进行加锁。它既可以用来声明一个 synchronized 代码块,也可以直接标记静态方法或者实例方法。
封面图

聊一聊Java垃圾回收与卡表技术

2021-02-21
阅读 4 分钟
1.4k
其中一些程序的结果,恰好验证了许多研究人员的假设,即大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间。(pmd 中 Java 对象生命周期的直方图,红色的表示被逃逸分析优化掉的对象)

怎么理解 Kafka 消费者与消费组之间的关系?

2021-01-29
阅读 2 分钟
16.2k
与生产者对应的是消费者,应用程序可以通过 KafkaConsumer 来订阅主题,并从订阅的主题中拉取消息。不过在使用 KafkaConsumer 消费消息之前需要先了解消费者和消费组的概念,否则无法理解如何使用KafkaConsumer。

图解分析:Kafka 生产者客户端工作原理

2021-01-27
阅读 3 分钟
1.6k
消息在真正发往 Kafka 之前,有可能需要经历拦截器、序列化器和分区器等一系列的作用,前面已经做了一系列分析。那么在此之后又会发生什么呢?先看一下生产者客户端的整体架构,如下图所示。

如何开发一个完善的 Kafka 生产者客户端?

2021-01-22
阅读 4 分钟
1.6k
Kafka 起初是 由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用。目前越来越多的开源分布式处理系统如 Cloudera、...

Kafka 中的消息存储在磁盘上的目录布局是怎样的?

2021-01-20
阅读 3 分钟
2.6k
Kafka 中的消息是以主题为基本单位进行归类的,各个主题在逻辑上相互独立。每个主题又可以分为一个或多个分区,分区的数量可以在主题创建的时候指定,也可以在之后修改。每条消息在发送的时候会根据分区规则被追加到指定的分区中,分区中的每条消息都会被分配一个唯一的序列号,也就是通常所说的偏移量(offset),具有4...

Nginx 最常用的两个功能:负载均衡和缓存

2021-01-19
阅读 2 分钟
2.1k
负载均衡和缓存功能是 Nginx 最常用的两个功能,这两个功能都属于高性能的调优手段,也和后端人员的关系比较密切,只有了解并会使用它们才能更好地调试和运行自己的项目。针对Nginx 负载均衡模式先前有整理过:Nginx 的负载均衡模式有哪些?它的实现原理是什么?。本篇主要围绕负载均衡和缓存功能和配置做归纳总结

没有源码调试!生产环境如何排除和优化 JVM?

2021-01-17
阅读 3 分钟
2k
生产环境中直接排查 JVM 的话,最简单的做法就是使用 JDK 自带的 6 个非常实用的命令行工具来排查。它们分别是:jps、jstat、jinfo、jmap、jhat 和 jstack,它们都位于 JDK 的 bin 目录下,可以使用命令行工具直接运行,其目录如下图所示:

Java 多线程并发控制工具信号量 Semaphore,实现原理及案例

2021-01-13
阅读 3 分钟
9.7k
信号量(Semaphore)是Java多线程兵法中的一种JDK内置同步器,通过它可以实现多线程对公共资源的并发访问控制。一个线程在进入公共资源时需要先获取一个许可,如果获取不到许可则要等待其它线程释放许可,每个线程在离开公共资源时都会释放许可。其实可以将Semaphore看成一个计数器,当计数器的值小于许可最大值时,所有...

Java多线程并发控制工具CountDownLatch,实现原理及案例

2021-01-07
阅读 3 分钟
2.9k
闭锁(CountDownLatch)是Java多线程并发中的一种同步器,它是JDK内置的同步器。通过它可以定义一个倒计数器,当倒计数器的值大于0时,所有调用await方法的线程都会等待。而调用countDown方法则可以让倒计数器的值减一,当倒计数器值为0时所有等待的线程都将继续往下执行。

Java 并发编程:AQS 的公平性

2021-01-05
阅读 2 分钟
1.5k
所谓公平是指所有线程对临界资源申请访问权限的成功率都一样,它不会让某些线程拥有优先权。通过几篇文章的分析我们知道了JDK的AQS的锁是基于CLH锁进行优化的,而其中使用了FIFO队列,也就是说等待队列是一个先进先出的队列。那是否就可以说每条线程获取锁时就是公平的呢?关于公平性,严格来说应该分成三个点来看:入队...

Java 并发底层知识,锁获取超时机制知多少?

2020-12-27
阅读 2 分钟
1.3k
当我们在使用Java进行网络编程时经常会遇到很多超时的概念,比如一个浏览器请求过程就可能会产生很多超时的地方,当我们在浏览器发起一个请求后,网络socket读写可能会超时,web服务器响应可能会超时,数据库查询可能会超时。而对于Java并发来说,与超时相关的内容主要是线程等待超时和获取锁超时,比如调用Object.wait(...

Java 并发编程:AQS 的自旋锁

2020-12-24
阅读 2 分钟
1.5k
互斥锁在AQS的互斥锁与共享锁中已经做了详细介绍,一个锁一次只能由一个线程持有,其它线程则无法获得,除非已持有锁的线程释放了该锁。这里为什么提互斥锁呢?其实互斥锁和自旋锁都是实现同步的方案,最终实现的效果都是相同的,但它们对未获得锁的线程的处理方式却是不同的。对于互斥锁,当某个线程占有锁后,另外一个...

Java 并发编程:AQS 的互斥锁与共享锁

2020-12-22
阅读 2 分钟
1.5k
我们知道现代机器处理器几乎都是多核多线程的,引入多核多线程机制是为了尽可能提升机器整体处理性能。但是多核多线程也会带来很多并发问题,其中很重要的一个问题是数据竞争,数据竞争即多个线程同时访问共享数据而导致了数据冲突(不正确)。数据竞争如果没处理好则意味着整个业务逻辑可能出错,所以在高并发环境中我...

Java 并发编程:AQS 的原子性如何保证

2020-12-21
阅读 2 分钟
1.9k
当我们研究AQS框架时(对于AQS不太熟知可以先阅读《什么是JDK内置并发框架AQS》,会发现AbstractQueuedSynchronizer这个类很多地方都使用了CAS操作。在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性。我们知道Java被隔离在硬件之上,硬件级别的操作明显力不从心。这时为了能够执行操作系统层面的操作,就必须...

Java 并发编程:如何防止在线程阻塞与唤醒时死锁

2020-12-17
阅读 3 分钟
2.9k
Java并发编程:多线程如何实现阻塞与唤醒 说到suspend与resume组合有死锁倾向,一不小心将导致很多问题,甚至导致整个系统崩溃。接着看另外一种解决方案,我们可以使用以对象为目标的阻塞,即利用Object类的wait()和notify()方法实现线程阻塞。当线程到达监控对象时,通过wait方法会使线程进入到等待队列中。而当其它线程...

Java 并发编程:多线程如何实现阻塞与唤醒

2020-12-16
阅读 2 分钟
1.3k
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题。如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节。Java为我们提供了多种API来对线程进行阻塞和唤醒操作,比如suspend与resume、sleep、wait与notify以及park与unpark...

Java 并发编程:并发中死锁的形成条件及处理

2020-12-13
阅读 2 分钟
1.3k
死锁是一种无限的互相等待的状态,两个或两个以上的线程或进程构成一个互相等待的环状。以两个线程为例,线程一持有A锁同时在等待B锁,而线程二持有B锁同时在等待A锁,这就导致两个线程互相等待无法往下执行。现实生活中一个经典的死锁情形就是四辆汽车通过没有红绿灯的十字路口,假如四辆车同时到达中心的,那么它们将...

Java 并发编程:多线程并发内存模型

2020-11-19
阅读 3 分钟
1.2k
多任务处理在现代计算机操作系统中几乎已是一项必备的功能了。在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。如果不希望处理器在大部分时间里都处于...