Jaqen's Blog

Jaqen's Blog

True mastery of any skill takes a lifetime

科学上网 Vultr 搭建 SS 方法
前几天,搬瓦工服务器到期了。准备再买的,但是最近搬瓦工被封的比较频繁,加上价格越来越高,想换一家试试,所以就找到了 vultr。 这里备忘一些 ss 连接服务器的命令。注册账户、购买、部署服务器步骤省略。 点击 官网地址 。 window 下需安装 git。 git 命令行输入: 1ssh root@45.76.111.96 接着输入密码(服务器密码,图中红框)。 12345wget –no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsock...
Java 内部类总结
Java 中,可以将一个类定义在另一个类或者一个方法里面,这样的类称为内部类。 一般包含四种内部类:成员内部类、匿名内部类、局部内部类和静态内部类。 成员内部类成员内部类的定义位于另一个类的内部,形式如下: 1234567891011121314151617181920public class Outer { private String name; class Inner { Inner(){ name = "wuzy"; } private void displayNa...
Java 类加载器
类的生命周期包含七个阶段: 加载、验证、准备、解析、初始化、使用、卸载。 验证、准备、解析三个阶段统称为连接。 加载、验证、准备、初始化和卸载的顺序是确定的,解析和初始化的前后顺序不一定,主要是为了实现动态绑定。 类加载过程类加载过程主要包含加载、验证、准备、解析和初始化这 5 个阶段。 加载加载是类加载的第一个阶段,注意不要混淆。 加载过程要完成的三件事情: 通过一个类的全限定名来获取定义此类的二进制字节流。 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口...
理解 ThreadLocal
ThreadLocal 是什么ThreadLocal 提供了线程局部变量。它和普通变量的区别在于,普通变量可以被任何一个线程访问并修改,而使用 ThreadLocal 创建的变量只能被当前线程访问,也就是线程私有,其他线程无法访问和修改。 ThreadLocal 用法创建: 1ThreadLocal<Boolean> threadLocal = new ThreadLocal<>(); set 方法: 1threadLocal.set(false); get 方法: 1threadLocal.get() 我们来看一个完整的示例: 12345678910111213...
Java 内存分配和回收策略
Java 的内存分配主要是在程序运行时给对象在堆上分配内存。通常将堆内存结构按新生代和老年代进行划分,堆内存结构图如下: 新生代大部分对象创建和销毁的区域。 内部包含 Eden 区域,作为对象初始分配的区域;两个 Survivor,也叫 from、to 区域,用来放置从 Minor GC 中生存下来的对象。 TLAB 对 Eden 区域再进行划分, Hotspot JVM 还有一个概念叫着 Thread Local Allocation(TLAB),这是 JVM 为每个线程分配的一个私有缓存区域。多线程同时分配内存时,为了避免操作同一地址,可能需要使用加锁机制,进而影响分配速度。TLA...
JVM 安全点介绍
什么是安全点?在 JVM 中如何判断对象可以被回收 一文中,我们知道 HotSpot 虚拟机采取的是可达性分析算法。即通过 GC Roots 枚举判定待回收的对象。 那么,首先要找到哪些是 GC Roots。 有两种查找 GC Roots 的方法: 一种是遍历方法区和栈区查找(保守式 GC)。 一种是通过 OopMap 数据结构来记录 GC Roots 的位置(准确式 GC)。 很明显,保守式 GC 的成本太高。准确式 GC 的优点就是能够让虚拟机快速定位到 GC Roots。 对应 OopMap 的位置即可作为一个安全点(Safe Point)。 在执行 GC 操作时,所有的工作线程必...
JVM 七种垃圾收集器
Java 垃圾收集器是 垃圾收集算法 的具体实现。 下图展示的是 7 种作用于不同分代的收集器,如果两种收集器之前有连接,表示它们可以配合使用。收集器所在的位置表示它是属于新生代收集器还是老年代收集器。 Serial 收集器单线程、串行收集器。即在垃圾清理时,必须暂停其他所有工作线程。 它是采用复制算法的新生代收集器。 下图是 Serial 收集器的运行过程。 ParNew 收集器ParNew 收集器是 Serial 收集器的多线程版本。除了使用多线程收集,其他与 Serial 收集相比并无太多创新之处。 默认开启的线程数量与 CPU 数量相同。 在单 CPU 的环境,ParNew ...
Java 垃圾收集算法有哪些?
本文主要介绍几种 Java 垃圾收集算法的原理及其优缺点。 标记清除(Mark-Sweep)算法首先进行标记工作,标识出所有要回收的对象,然后进行统一回收被标记的对象。 对象标记的过程在 Java 对象的自我救赎 一文中有介绍。执行过程如下图: 它的不足之处在于: 1、标记、清除的效率都不高。 2、清除后产生大量的内存碎片,空间碎片太多会导致在分配大对象时无法找到足够大的连续内存,从而不得不触发另一次垃圾回收动作。 复制(Copying)算法将可用内存按容量分成大小相等的两块,每次只使用其中的一块。 当这一块内存用完了,就将还存活的对象复制到另外一块上面,再把已使用过的内存空间一次清理...
Java 对象的自我救赎
JVM 通过可达性分析算法判断一个对象是否可以被回收 ,但并不是一个对象不可达时,就宣告“死刑”的,此时只是暂时处于”缓刑“阶段。要宣告一个对象“死刑”,至少还要经历两次标记过程。 没有必要执行 finalize() 方法的筛选条件取决于: 1、 finalize() 方法已经被执行过(finalize()`只会执行一次)。 2、对象没有重写 finalize()方法。 如果一个对象有必要执行 finalize() 方法,会进入 F-Queue 队列,等待 Finalizer 线程执行。 因此如果想要完成对象自救, finalize()是逃脱死亡的最后一次机会,重新与引用链上的任何...
JVM 中如何判断对象可以被回收?
JVM 的垃圾回收器主要关注的是堆上创建的实例对象,在每次对这些对象进行回收前,需要确定哪些对象是可以去进行回收的。 主要有下面两种方法。 引用计数算法给对象添加一个引用计数器,当有一个地方引用它,计数器值加 1;当引用失效时,计数器值减 1。任何时刻计数器值为 0 表示这个对象可以被回收了。 优点: 判断效率高,实现简单。 不足之处: 难以解决对象之间相互循环引用的问题。 比如: 12345678910111213141516171819public class GCDemo { public static void main(String[] args) &...
avatar
Jaqen Ng
True mastery of any skill takes a lifetime