分享自用Halo网站自助定时备份方案
本站为Halo2搭建,Halo2默认使用的是H2数据库。为了防止意外数据丢失,需要做定时备份。现有增加备份的插件,但是需要付费。因此本文来介绍一个自助的定时备份方案。 1. 配置git12345yum install -y gitgit config --global user.name 'Git用户名'git config --global user.email "Git邮箱" 脚本提交的时候不输密码,所以需要配置ssh key,git远程仓库提供商的 ssh key配置验证方式不同。本文使用的是Gitee,可以查看其文档。 2. 初始化git仓库12345cd ~/.halo2git initgit remote add origin git@gitee.com:***/***.git 3. 编写自动备份脚本 blog_backup.sh: 12345678910111213141516171819202122232425#! /bin/bash# Print current timeecho "**********...
常见的垃圾回收器
本文主要内容是介绍常见的垃圾回收器。总体分为年轻代回收器和老年代类回收器,如下图所示: 可见,除了G1回收器外,年轻代和老年代回收器各三个。接下来将分别介绍。 1. Serial + Serial OldSerial和Serial Old是最古老的垃圾回收器。其特点是单线程执行,且在工作时,需要暂停其它所有的线程。它的优势是简单且高效,额外内存消耗小。目前是HotSpot虚拟机运行在客户端模式下的默认新生代和老年代垃圾回收器。有如下特点: 针对新生代; 采用复制算法; 单线程收集; 进行垃圾收集时,必须暂停所有工作线程,直到完成; 年轻代采用复制算法实现,老年代采用标记-整理算法实现。 1.1 优势简单高效,由于采用的是单线程的方法,因此与其他类型的收集器相比,对单个cpu来说没有了上下文之间的的切换,效率比较高。 1.2 劣势会在用户不知道的情况下停止所有工作线程。 1.3 使用场景 Client 模式(桌面应用): 在用户的桌面应用场景中,可用内存一般不大,可以在较短时间内完成垃圾收集,只要不频繁发生,这是可以接受的 单核服务器:对于限定单个CPU的环境来说...
线程的状态
本文的主题是讨论线程的状态。主要为操作系统层面的线程状态以及JVM层面上的线程状态之间的联系。并对JVM线程不同状态间的转换的方式进行梳理。 1. 操作系统层面操作系统层面的线程状态有五种,分别是:New、Ready、Running、Waiting、Terminate。如下图所示: New: 仅是在语⾔层⾯创建了线程对象,还未与操作系统线程关联; Ready: 指该线程已经被创建(与操作系统线程关联),可以由 CPU 调度执⾏; Running: 指获取了 CPU 时间⽚运⾏中的状态。当 CPU 时间⽚⽤完,会从运⾏状态转换⾄可运⾏状态,会导致线程的上下⽂切换; Waiting: 如果调⽤了阻塞 API,如 BIO 读写⽂件,这时该线程实际不会⽤到 CPU,会导致线程上下⽂切换,进⼊Waiting状态,等 BIO 操作完毕,会由操作系统唤醒阻塞的线程,转换⾄Ready状态,与Ready的区别是,对Waiting的线程来说只要它们⼀直不唤醒,调度器就⼀直不会考虑调度它们。 Terminate: 表示线程已经执行完毕,生命周期已经结束,不会转换为其他状态。 2. JVM层...
认识AQS
在并发编程中,AQS(AbstractQueuedSynchronizer)是一个非常重要的类,JUC中很多工具都是基于AQS进行开发。其设计和编码思路都极其精妙。本文的目的是先对AQS进行一个大致的介绍,具体的实现细节将在后续的各种同步组件的实现中进行详细解释以体现出其设计思想的巧妙之处。 1. 动手实现一个锁为了认识AQS的功能,我们先自己动手实现一个非常简易的独占不可重入锁。代码如下: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051public class MyLock1 extends AbstractMyLock{ // 用于保存锁状态, 1表示有线程池有所,2表示锁空闲 private volatile int status; // 表示当前持有锁的线程 private volatile static Thread t = null; // Unsafe类的对象 private sta...
讨论几个Thread的常用API
本文针对Thread类中常用的API进行介绍。以下是一些常见的方法: 方法 功能 public void start() 启动⼀个新线程;Java虚拟机调⽤此线程的run()⽅法 public void run() 线程启动后调⽤该⽅法 public void setName(String name) 给当前线程取名字 public void getName() 获取当前线程的名字。默认⼦线程是Thread-索引,主线程是main public static Thread currentThread() 获取当前线程对象,代码在哪个线程中执⾏ public static native void yield() 提示线程调度器让出当前线程对 CPU的使⽤ public static void sleep(long time) 让当前线程休眠多少毫秒再继续执⾏ public final int getPriority() 返回此线程的优先级 public final void setPriority(int priority) 更改此线...
论文 Deep Learning for Encrypted Traffic Classification An Overview
0、摘要 这是篇关于加密流量分类的综述,加密流量分类的入门之作,流量分类应用范围广泛,从isp的QoS提供和计费,到防火墙和入侵检测系统的安全应用。从最简单基于端口的、数据包检测到经典的机器学习方法,到由于深度学习的兴起,神经网络成为加密流量分类的主流。本文介绍了常用的深度学习方法及其在流量分类任务中的应用。然后讨论了开放的问题和它们的挑战。关键词:流量分类、深度学习、机器学习 1、介绍简要介绍了加密流量分类方法的发展演变,具体如下:1.1 基于端口(port)的流量分类 优点:简单 缺点:该方法的准确性一直在下降,因为较新的应用程序要么使用众所周知的端口号来掩盖其流量,要么不使用标准的注册端口号。 1.2 基于有效载荷或数据包检验(data packet inspection:DPI)原理是不同类型的网络流量之中有特定的字符流(也称之为指纹),只需要在数据包的任意位置匹配这些字符流,从而进行分类。 优点:简单快速,只需要检测网络流的前几个数据包。 缺点:方法仅适用于未加密的流量,且计算开销较大。 1.3 基于流量统计特征这些方法依赖于流量的统计或时间序列特性,能够处理...
运行时内存详解
运行时数据区总体组成上节已经介绍过。接下来需要讨论的问题有两个: 有哪些数据区会出现内存溢出? JDK不同版本间运行时内存区域的实现有哪些变化? 1. 哪些数据区会内存溢出?先给出答案,会出现内存溢出(OOM)的区域有: 本地方法栈 虚拟机栈 ^6c721d 方法区 堆 ^947181 直接内存(准确来说,不属于JVM运行时数据区) 也就是说只有程序计数器不会出现内存溢出。 1.1 堆内存溢出也是最常见的内存溢出。指的是在堆上分配的对象空间超过了堆的最大大小,导致内存溢出。溢出时,会抛出OutOfMemoryError,并提示Java Heap Space导致,也就是常说的OOM。如下图所示: 可以使用 -Xmx 参数设置堆的最大大小,如:-Xmx500m,即代表设置堆的最大内存大小为500m。 1.2 栈内存溢出是第二常见的内存溢出情况。指的是所有栈帧的占用超过了栈空间的最大值。溢出后会抛出 StackOverflowError 。如下图所示: 栈空间的最大值可以使用 -Xss 进行设置,如 -Xss512k代表最大值为512k。 1.3 方法区内存溢出方法...
关于双亲委派
要了解双亲委派,就需要先了解类加载器,可以参考[[类的生命周期及类加载器]]一文。 1. 双亲委派机制是什么?双亲委派机制指的是:当一个类加载器收到加载类的任务时,会向上查找查找是否加载过,再由顶向下进行加载。 即,当某个类加载器收到加载任务,如果自己没有加载过此类,则会向上委派加载任务给自己的父加载器,如此重复知道委托到启动类加载器,然后再尝试加载类,如果当前类加载器无法加载,则任务下发给自己的子类加载器。过程如下图: 举例说明假设现在用应用程序类加载器(Application ClassLoader)来加载当前项目classpath目录下的 Demo9.class文件。步骤如下: Application ClassLoader收到加载任务后,先查询自己是否加载过此类。若加载过,直接返回class对象即可。否则委托给Extension/Platform ClassLoader。 Extension/Platform ClassLoader收到后,查询是否加载过此类,若加载过,直接返回class对象,否则,委托给Bootstrap ClassLoader。...
NIO基础
一. NIO 基础non-blocking io 非阻塞 IO 1. 三大组件1.1 Channel & Bufferchannel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层 123graph LRchannel --> bufferbuffer --> channel 常见的 Channel 有 FileChannel DatagramChannel SocketChannel ServerSocketChannel buffer 则用来缓冲读写数据,常见的 buffer 有 ByteBuffer MappedByteBuffer DirectByteBuffer HeapByteBuffer ShortBuffer IntBuffer LongBuffer FloatBuffer DoubleBuffer CharBuffer 1.2 Se...
导入搜狗词库到IBus输入法
1. 背景Linux中使用的是IBus输入法,虽然有Linux版本的搜狗输入法,但是由于搜狗输入法的安装过于复杂,且不如IBus稳定。但是由于IBus的联网联想功能延迟太大,又没有比较完善的基础词库,导致码字体验较差,因此可以将搜狗输入法的词库导入IBus。 2. 方案2.1 转换格式,直接导入 在搜狗输入法中, 点击 设置 -> 词库 -> 导出词库。得到bin格式的词库文件。 使用 深蓝词库转换工具,将 步骤1中的词库转换为 libPinyin 的格式。点击下载 然后点击 设置 -> 键盘 -> 中文 -> 首选项 -> 用户数据 -> 用户词典 -> 导入。 但是此方案还需要下载工具,且工具只支持Windows和MacOS。我没有使用此方案。 2.2 直接官方下载词库文件,使用脚本导入 进入搜狗拼音官网下载后缀为 scel 的词库文件。一键直达 使用以下脚本,直接运行即可。 脚本如下: 1234567891011121314151617181920212223242526272829303132333435363738...