旧·时光 | Time

Something that stays in your mind will someday spring up in your life.

回顾《深入理解 Java 虚拟机》之 Java 和线程

第六篇

首先,并发不一定要依赖多线程,例如 PHP 中可以存在多进程并发。但是当我们在 Java 里面谈论并发时,一般都与线程脱不了干系,因此我们先来谈谈什么是线程,它跟进程有什么区别。 再谈进程与线程 如果一个服务器同时只能为一个客户端连接服务,其他都需要阻塞,那么效率定然会很感人,为了让服务器能同时服务更多的客户端连接,会经常应用并发编程。而实现并发的手段有多进程、多线程、IO 多路复用等。...

回顾《深入理解 Java 虚拟机》 之内存模型和 volatile 关键字

第五篇

定义 Java 内存模型并不是一件容易的事情,这个模型必须定义得足够严谨,才能让 Java 的并发操作不会产生歧义;但是,也必须得足够宽松,使得虚拟机的实现能有足够的自由空间去利用硬件的各种特性(寄存器、高速缓存等)来获取更好的执行速度。经过长时间的验证和修补,在JDK1.5发布后,Java内存模型就已经成熟和完善起来了。 主内存和工作内存 Java 内存模型中规定了所有的变量都存储在主...

回顾《深入理解 Java 虚拟机》之类加载器

第四篇

虚拟机团队把类加载阶段中的 “通过一个类的全限定名来获取描述此类的二进制字节流” 这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己去决定如何获取所需要的类,实现这个动作的代码模块称为 “类加载器”。 首先,先要知道什么是类加载器。简单说,类加载器就是根据指定全限定名称将 Class 文件加载到 JVM 内存,转为 Class 对象。 如果站在虚拟机的角度来看,只存在两种类加载...

回顾《深入理解 Java 虚拟机》之类加载机制

第三篇,虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制

虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段: 除却解析之外,其他各个阶段都是严格按顺序执行的,解析则不一定,为了支持 Java 的运行时绑定特性...

回顾《深入理解 Java 虚拟机》之垃圾收集器

第二篇,GC 并非 Java 的专利,事实上最早 Lisp 语言就有了 GC 和内存动态分配的概念

GC 并非 Java 的专利,事实上最早 Lisp 语言就有了 GC 和内存动态分配的概念。GC 的重点在于两个: 如何判定对象的存活与否 如何进行垃圾回收,这里又分为不同的回收算法 如何判断对象存活 关于 GC roots 选取的这个问题,知乎上 R大 有过详细的回答,这里贴上链接:Java 的 GC 为什么要分代?,顺便表达一下对R大的敬仰,简直是知乎清流啊,努力成...

回顾《深入理解 Java 虚拟机》之 Java 内存区域

第一篇,过年会把《深入理解 Java 虚拟机》回看一遍,整理下知识点

过年会把《深入理解 Java 虚拟机》回看一遍,整理下知识点 C/C++ 的内存管理都在编码人员自己的手里进行控制,delete/free 虽能让人感受到上帝视角的快感,却也加大了对编码人员的考验。Java、Golang、Nodejs 等现代语言因为有虚拟机这层,所以将内存管理的工作移交给了虚拟机做。 JVM 运行时内存区域 每个区域的功能如下: 对象的创建 我们经...

ThreadPoolExecutor 核心源码解析

本文介绍 ThreadPoolExecutor 源码的关键部分,execute、addWorker、runWorker、Worker

本文只介绍 ThreadPoolExecutor 源码的关键部分,开篇会先介绍 ThreadPoolExecutor 中的一些核心常量定义,然后选取线程池工作周期中的几个关键方法分析其源码实现。其实,看 JDK 源码的最好途径就是看类文件注释,作者把想说的全都写在里面了。 一些重要的常量 ThreadPoolExecutor 内部作者采用了一个 32bit 的 int 值来表示线程池的...

分析伪共享(False Sharing)产生原因

什么是伪共享呢(False Sharing)呢,讲清楚伪共享出现的原因,我们要先理清楚高速缓存和 MESI 缓存一致性协议

之前读了一篇美团点评技术博客 2016 年发表的文章:高性能队列——Disruptor,里面提到了 ArrayBlockingQueue会因为加锁和伪共享等出现严重的性能问题。 什么是伪共享呢(False Sharing)呢,讲清楚伪共享出现的原因,我们要先理清楚高速缓存和MESI缓存一致性协议。 Cache Memory 我们都知道 CPU 和主内存之间的运算速度是差异巨大的,在现今...

Java 基础技术总结

总结一下至今为止 Java 的基础知识

到现在为止,写过 Java、Go、JavaScript、Python、C,用得最多的还是 Java,总结一下至今为止 Java 的基础知识,都是发在 CSDN 上的文章,这篇博文主要就是列一下文章列表。 Java 基础 接口 vs 抽象类 Java总结:接口vs抽象类、重写vs重载 Exception vs Error Java总结:一文讲透 Exception 和 Error 的差...

2018 年终总结,如果还有梦就追

对我来说,不留恋过去并不是不重感情,只是我更期待未来而已。既往不恋,纵情向前,我倒是很契合这句话。

博客很久没更新了,因为最近实在太忙了,明年一定会保持稳定更新的,这个 flag 立在这里。 2018 年是大学生涯的最后一年,也是参加工作的第一年。总的来说,一年的内容分为三个部分,6月份之前一边实习一边做毕设,7月初去了重庆和成都当做毕业旅行,7月中旬正式入职一直工作到现在。 毕设 毕设项目选了个实习的小工作,但其实项目的代码在三月份就写完了,后面两个月都是纠结在怎么往论文里...

Survivability of Cloud Databases - Factors and Prediction,SIGMOD 18

论文阅读系列

这是 SIGMOD 18 新设的 industry section 收录的一篇来自微软 Azure 团队的论文,主题是通过检测数据(telemetry raw data)来预测数据库是 short-lived(<= 30 天)还是 long-lived(>30天),他们认为理清这个有助于他们了解用户行为和帮助他们进行更好地资源隔离、分配和调度,从而提高收入(我觉得是根本目的吧)。...

Java 中的静态代理与动态代理

RPC 相关第五篇

什么是代理模式 人话来讲就是由代理对象来执行目标对象的方法,且还可以在代理对象中增强目标对象方法的一种设计模式。类比生活,像是房产中介。代理模式存在的意义和一个架构设计原则息息相关 —— 开闭原则(对扩展开放,对修改关闭),即一种好的设计模式,都是在不修改原有形态的基础上扩展出新的功能。 为什么需要代理 代理模式的概念很容易理解,但是早期的我即使读懂了代理模式的概念,对为什么要使用代理模式...

[译] Async IO on Linux: select, poll, and epoll

RPC 半相关第四篇

原文地址:Async IO on Linux: select, poll, and epoll 作者:Julia Evans 虽然一直是个 Java 程序员,但是 select、poll、epoll 这些词汇还是经常听见的,上次写完 UNIX I/O 之后又去再看了一下这部分内容,遇到了这篇文章,感觉不错特此翻译下来,下面是正文。 今天讲一讲我从这本书《The Linux Program...

UNIX 下的 I/O 模型

RPC 相关第三篇

开篇 RPC 中很重要的部分就是网络通信,因此这篇叙述一下 Unix 下为解决不同 I/O 问题所设计的 I/O 模型。首先要说明的是,I/O 是个很宽泛的概念,常见的有网络 I/O、磁盘 I/O、内存 I/O 等。 在 Unix 系统下,不论是标准输入还是借助套接字接受网络输入,其实都会有两个步骤,很多文章都提到: 等待数据准备好(Waiting for the data to ...

如何实现一个简单的 RPC 调用流程

RPC 相关第二篇

Intro 今天花了半天,学习了一下如何创建 Maven 多模块项目,主要参考了以下博客: IntelliJ IDEA 构建maven多模块工程项目(详细多图) IntelliJ IDEA中创建Web聚合项目(Maven多模块项目) 在搭建好项目框架之后,实现了一个简单版本的 RPC 调用 —— 项目地址,其中实践了一下 GuavaCache 中学到的 Builder 设计模...