木西笔记

个人博客

Linux 操作系统原理-文件系统(1)

虚拟文件系统

简介 ![](openerating-learning-vfs-1/openerating-learning-vfs-1-1601175693517.png) 虚拟文件系统(Virtual File System,简称VFS)是Linux内核的子系统之一,它为用户程序提供文件和文件系统操作的统一接口,屏蔽不同文件系统的差异和操作细节。借助VFS可以直接使用open()、read()、...

深入JVM字节码(2)

Java ClassLoader 加载过程

前言我们上一章节讨论了字节码的一些分布,具体的请看深入JVM字节码(1) Java Class 详解,字节码是对象生成的一个模板,本节将会从个源码分析来剖析一下,JVM是怎样加载类到内存的。 ClassLoaderJAVA类加载流程Java语言系统自带有三个类加载器: Bootstrap ClassLoader 最顶层的加载类,主要加载核心类库,%JRE_HOME%\lib下的rt.jar...

深入JVM字节码(1)

Java Class 详解

前言作为一个Java开发者,对技术的追求而不仅仅停留在会用API,会写基本功能上,要想在技术上有更高的造诣,就需要深入到原理层面去认识代码运行的机制。因此,本文从class字节码文件的结构入手,一步步来解剖二进制字节码的内部工作原理,这对深入理解JVM的运行机制大有裨益,同时,对于想要使用BCEL来动态改变Class字节码指令的工作也很有帮助(示例:JVM Class字节码之三-使用BCEL...

Java垃圾回收详解(5)

CMS 垃圾回收器详解之二 CMS 深入分析

回顾继上一节,讨论了CMS的gc 流程,本篇讨论几个遗留的问题。 CMS 的缺点CMS GC 和Full GC 和 Minor GC 的区别 CMS GC 通过一个后台线程触发,触发机制是默认每隔2秒判断一下当前老年代的内存使用率是否达到阈值,当然具体的触发条件没有这么简单,如果是则触发一次cms gc,在该过程中只会标记出存活对象,然后清除死亡对象,期间会产生碎片空间。 Full G...

Java垃圾回收详解(4)

CMS 垃圾回收器详解之一 CMS 处理流程

CMS 垃圾回收器简介由于上一篇博文已经详细介绍了,这里就不在赘述,有兴趣可以围观一下Java垃圾回收详解(2)GC方式介绍 这里做一个简单的回顾: 获取最短回收停顿时间为目标的多线程并发收集器 cms 只会回收老年代和永久带(1.8开始为元数据区,需要设置- CMSClassUnloadingEnabled, 不会收集年轻带; cms 是一种预处理垃圾回收器,它不能等到old内存用尽...

Java垃圾回收详解(6)

CMS 垃圾回收器详解之一 CMS GC常见问题分析

定位GC日志中STW时间较长的行为打印所有STW停顿1-XX:+PrintGCApplicationStoppedTime和-XX:+PrintGCApplicationConcurrentTime 找出所有暂停时间超过阈值的地方,如下:1awk '{match($0,/.*stopped:(.*)seconds,/,a);if(a[1]>0.5) print $0...

Spring-Retry 源码分析

前面我们用自己的代理模式完成一些重试的操作,接下来我们将分析一下 SpringRetry 的实现方式spring-retry 项目实现了重试和熔断功能,目前已用于SpringBatch、Spring Integration等项目 详解QuickStart我们首先来看一下使用。首先我们引入使用,这里我们使用的是1.3版本 123456<!-- https://mvnrepository....

JAVA多线程之Atomic和LongAddr类(2)

LongAddr 类详解

概诉上一节,我们讨论了Atomic类的实现原理,以及代码分析。这一节我来看 LongAddr 类。LongAdder 是JDK8添加到JUC中的。它是一个线程安全的、比Atomic*系工具性能更好的”计数器”。 首先我们来看一下 Doug Lea 大神对这个类的概述 LongAddr LongAdder 中会维护一个或多个变量,这些变量共同组成一个long型的和(这个和就是 LongAdd...

JAVA多线程之常见的并发工具类(1)

并发工具类举例

概诉本文会对java JUC 下的并发包做一个统一的讲解,针对于源码分析环境,需要取查看博主的另外一个系列——多线程,这里对细节不在深入。 Semaphore 信号量是一类经典的同步工具。信号量通常用来限制线程可以同时访问的(物理或逻辑)资源数量。 CountDownLatch 一种非常简单、但很常用的同步辅助类。其作用是在完成一组正在其他线程中执行的操作之前,允许一个或多个线程一直阻塞...

JAVA多线程之Atomic和LongAddr类(1)

Atomic类详解

概述Atomic与LongAddr解决什么问题解决变量赋值的原子性问题。 底层采用的是CAS的自旋的方式来实现的。CAS会有ABA和性能的问题,Atomic 采用版本号的方式来解决ABA的问题。ABA问题是否会对业务产生影响,还需要业务方自己评估,大部分情况下比如一些非金融业务系统中,ABA不会对业务造成影响。至于性能问题,CAS自旋的方式确实会造成一些CPU的空转,因为严格意义上来说CAS...