什么是Java内存模型?

作者:薛8 来源:https://ddnd.cn/2019/03/11/java-memory-model/ 前言 要想深入了解Java并发编程,就要先理解好Java内存模型,而要理解Java内存模型又不得不从硬件、计算机内存模型说起,本文从计算机内存模型产生的原因、解决的问题谈起,然后再对Java模型进行介绍,最后对计算机内存模型和Java内存模型进行总结,希望大家看完本文之后有所收获! CPU工作过程及出现的问题 CPU执行过程 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行的时候, »

Kafka设计解析-Kafka High Availability

1. Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统。主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间复杂度的访问性能 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输 支持Kafka Server间的消息分区,及分布式消费,同时保证每个Partition内的消息顺序传输 同时支持离线数据处理和实时数据处理 Scale out:支持在线水平扩展 2. Kafka架构 Broker:Kafka集群包含一个或多个服务器,这种服务器被称为broker Topic: »

从1+1=2来理解Java字节码

背景 前不久《深入理解Java虚拟机》第三版发布了,赶紧买来看了看新版的内容,这本书更新了很多新版本虚拟机的内容,还对以前的部分内容进行了重构,还是值得去看的。本着复习和巩固的态度,我决定来编译一个简单的类文件来分析Java的字节码内容,来帮助理解和巩固Java字节码知识,希望也对阅读本文的你有所帮助。 说明:本次采用的环境是OpenJdk12 编译“1+1”代码 首先我们需要写个简单的小程序,1+1的程序,学习就要从最简单的1+1开始,代码如下: package top. »

Spring Cloud Sleuth服务链路追踪

Zipkin服务追踪原理 创造一些追踪标识符(tracingId,spanId,parentId),最终将一个request的流程树构建出来,各业务系统在彼此调用时,将特定的跟踪消息传递至zipkin,zipkin在收集到跟踪信息后将其聚合处理、存储、展示等,用户可通过web UI方便获得网络延迟、调用链路、系统依赖等等。 transport作用:收集被trace的services的spans,并将它们转化为zipkin common Span,之后把这些Spans传递的存储层 collector会对一个到来的被trace的数据(span)进行验证、存储并设置索引(Cassandra/ »

JVM深入理解-垃圾回收

前言 最近线上出现了JVM 频繁FGC的问题,查询了很多GC相关的资料,做了一些整理翻译。文章比较长可以收藏后慢慢阅读。 一、什么是垃圾回收?(Garbage Collection) 一个垃圾回收器有一下三个职责 分配内存 确保有引用的对象能够在内存中保留。 能够在正在执行的代码环境中回收已经死亡对象的内存。 这里提到的有引用是指存活的对象,后面会提到一些算法用来判断对象是否存活。不在有引用的对象将被认为是死亡的,也就是常说的垃圾garbage。找到并释放这些垃圾对象占用的空间的过程就被称作是垃圾回收garbage collection。 垃圾回收可以解决很多内存分配的问题,但并不意味这全部。 比如:你可以不断地创建对象并保持对它们的引用直到没有可用的内存分配。垃圾回收本身就是一项非常复杂和消耗资源的过程。 二、 »

深入分析synchronized原理和锁膨胀过程

前言 上一篇文章介绍了多线程的概念及synchronized的使用方法《synchronized的使用(一)》,但是仅仅会用还是不够的,只有了解其底层实现才能在开发过程中运筹帷幄,所以本篇探讨synchronized的实现原理及锁升级(膨胀)的过程。 synchronized实现原理 synchronized是依赖于JVM来实现同步的,在同步方法和代码块的原理有点区别。 同步代码块 我们在代码块加上synchronized关键字 public void synSay() { synchronized (object) { System.out.println("synSay----" + Thread.currentThread().getName( »

Spring事务传播属性有那么难吗?看这一篇就够了

学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过几天就会忘记,接下来我们一起实践来学习Spring事务的传播属性。 传播属性 传播属性定义的是当一个事务方法碰到另一个事务方法时的处理行为,一共有七种行为,定义如下 | 传播性 | 值 | 描述 | | --------------------------- | ---- | ------------------------------------------------------------ | | PROPAGATION_REQUIRED | 0 | 支持当前事务,如果没有就新建事务 | | PROPAGATION_SUPPORTS | 1 | 支持当前事务,如果没有就不以事务的方式运行 | | PROPAGATION_ »

CPU的缓存L1、L2、L3与缓存行填充

L1,L2,L3 指的都是CPU的缓存,他们比内存快,但是很昂贵,所以用作缓存,CPU查找数据的时候首先在L1,然后看L2,如果还没有,就到内存查找一些服务器还有L3 Cache,目的也是提高速度。 高速缓冲存储器Cache是位于CPU与内存之间的临时存储器,它的容量比内存小但交换速度快。在Cache中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从Cache中调用,从而加快读取速度。由此可见,在CPU中加入Cache是一种高效的解决方案,这样整个内存储器(Cache+内存)就变成了既有Cache的高速度, »

CPU Cache与高性能编程

作者:少数pai 来源:https://blog.csdn.net/karamos/article/details/80126704 认识CPU Cache CPU Cache概述 随着CPU的频率不断提升,而内存的访问速度却没有质的突破,为了弥补访问内存的速度慢,充分发挥CPU的计算资源,提高CPU整体吞吐量,在CPU与内存之间引入了一级Cache。随着热点数据体积越来越大,一级Cache L1已经不满足发展的要求,引入了二级Cache L2, »

Spring Bean初始化过程

init-method方法 init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。init-method需要在applicationContext.xml配置文档中bean的定义里头写明。例如: <bean id="TestBean" class="nju.software.xkxt.util.TestBean" init-method="init"></bean> 这样,当TestBean在初始化的时候会执行TestBean中定义的init方法。 afterPropertiesSet方法 »