谭浩的博客

Simple is beauty.

Java 垃圾回收机制

JVM 架构

其中堆内存和垃圾回收联系紧密,运行时创建的 Java 对象在堆内存中存储,当 Java 对象不在被任何对象引用时(引用不可达)被垃圾回收器回收空间。

Goroutine 和 Thread

在学习6.824课程的时候接触到了 Go 语言,其由 google 创造的且正在云计算和区块链领域大展伸手,比如docker、etcd、超级账本fabric等。在我看来,这是个简单粗暴美的编程语言,相比于 Java 更显轻盈,Java 相对来说更加中庸。而最吸引我的就是其并发机制,让菜鸟的我能快速上手的写并发项目。而这篇小笔记就是对Goroutine 和 Thread 的对比。快速了解 Go 并发可以浏览这篇文章

快学设计模式

创建型模式 (Creational Patterns)

创建型设计模式提供各种对象创建机制。

单例模式 (Singleton pattern)

单例模式主要解决以下问题:

  • 保证一个类只有一个实例
  • 类如何控制其实例化
  • 限制类的实例数量

单例模式的解决方案:

  • 私有化对象的构造函数
  • 定义静态方法返回类的唯一实例

分布式系统 —— Raft详解

基本介绍

Raft 协议是一个分布式共识协议,其用来使多台机器想一台机器一样对外提供服务,同时能够忍受少部分机器崩溃问题。通过在多台机器上维护复制日志的一致性来实现复制状态机,从而解决分布式系统的若错性。

Raft 协议通过对问题进行分解和解耦,将一致性协议分解为三个独立的子问题:

  • Leader Election: 当现存的领导者宕机之后,一个新的领导者将被选举出来。
  • Log Replication: 领导者从客户端接受日志条目,在集群中复制日志,并强制其他节点的日志和其保持一致。
  • Safety:任何服务节点在状态机中应用了某个日志,则其他节点不能再同样的日志索引下应用不用的日志。通过增加选举机制保障该属性。

分布式系统 —— BASE、拜占庭问题以及CAP

不要让完美成了好的敌人

ACID 语义需要大量的努力和沟通。当我们的结果需要绝对正确时这是值得的,但是有一些情况,我们可以容忍一些陈旧和不一致。

例如一个在线商城的例子,如果需要购买一个或者两个商品,那么告诉你具体有450还是452个可售商品关系大吗?在这种情况下,稍有陈旧的值影响不大。但是当你需要结账的时候正确性就很重要,如果他们拿走了你的钱,那么你最好也要拿走的你的货。在这种情况下,大多数的查询允许有点陈旧,但是在最终时刻,我们需要正确的答案。

一个好的想法是我们可以在正确性和时间、精力以及可用性之间做权衡。对于不同的应用程序来说,不惜一切代价地采取完全正确和一致性可能是不必要的极端。

分布式系统 —— 事务ACID、2PC、3PC、2PL

ACID事务

传统的数据库系统依赖于将工作捆绑到具有 ACID 属性的事务中。如此,他们就通过牺牲可用性或者分区容忍性来保证一致性。ACID 是以下单词的缩写:

  • Atomicity “All or nothing”
  • Consistency 隐含着两种类型的一致性。单一系统的一致性以及跨系统的一致性。换句话说,如果从一个银行转出100元至另一个银行。不仅一个银行扣除了100,另一个银行也需要加上这100.
  • Isolation 无论并发级别如何,事务必须产生相同的结果就像一次只有一个事务执行一样(可以是任何一个可能的执行顺序)
  • Durability 持久性,即使崩溃了,已有数据依然存在

Java 内存模型

Java 内存模型

正如上图所示,JVM 内存被分为两个区域。广义上来讲,实际上是 JVM 的堆内存被分为两部分:新生代老年代

Java 的类加载机制

基础介绍

类加载器负责在运行时将 Java 类地加载到 JVM 中,其是 JRE 的一部分。这些 Java 类不会同时全部被加载到内存中,而是在应用需要时才会加载。

堆及堆的应用

基本介绍

堆是一种基于树的数据结构。其满足以下特征:给定堆的中任意节点 P 和 C, 若 P 是 C 的父节点,那么 P 的值小于等于(或大于等于)C 的值。如果父节点的值恒小于子节点的值,则为最小堆,反之则为最大堆。

因为堆所具有的这种特性,因此其常为另一种抽象数据结构(优先队列)的最高效的实现方式。在堆中最高或者最低权限的元素总是存储在根节点。需要注意的是:堆并不是一个有序的数据结构,其只保证了父节点与子节点之间的有序,因此是部分有序的。

使用 cron 进行任务调度

基本介绍

“Cron” 是类 Unix 系统(Linux,FreeBSD,Mac OS等)上的基于时间的作业调度器。这些任务或作业被称为”Cron Jobs”。Cron 作为一个守护程序运行在系统中,该程序按计划调度相应的任务,计划可以在一个名为”crontab”文件中进行配置。

在大部分 Linux 发行版中,crond 都被自动安装并加入启动脚本中。可以运行下面的的命令,检查其是否在运行中:

我的2018

2018 的回顾

自去年写了第一篇年终总结以来,12个月的时间真的就是一溜烟儿地过去了。几个月前突然意识到 2017 年立的 flag 快要倒的窘境仿佛就在前几天一般。回顾 2018,这一年还是收获多多,虽然这一年的心情状况是自我真正意识到何为喜怒哀乐以来的最糟糕的一年,尤其是在12月时压抑的心情似乎已经快冲破了我的承受能力。

golang 并发基础

Share by communication

并发编程在很多时候因为需要正确地访问共享变量而变得非常困难。go 提供了一种将共享值在 channel 上传递的方法,任何时候都只有一个 goroutine 可以访问该值,从而避免了数据竞争。这也正是 go 主张的:

不要通过共享内存来实现通信,而是通过通信来实现共享内存。