CHuiL

AC自动机-Aho-Corasick automaton

AC自动机的算法融合了trie前缀树和KMP的思路来实现在O(n)时间复杂进行多模匹配 Trie的特点是,在一颗trie树中包含有多个关键词,并且利用公共前缀来减少不必要的字符比较,提高查询效率。 但是用在一个字符串匹配多模的场景下,依然需要对原串循环查询,这里减少的只是每次查询时拥有公共前缀的那部分子串。 而KMP算法利用next数组,来实现O(n)时间复杂对一个串和子串的匹配。nex...

g1垃圾收集器

gc

G1收集器(Garbage-First Garbage Collector) G1是服务器类型的垃圾收集器,适合多处理器大内存的机器运行。他的目标是兼顾高吞吐量和响应时间,满足用户定义的暂停时间目标。在对整个堆进行例如标记操作的过程中,应用的线程也是同时在执行的。 在G1执行一个并发的全局标记之后,就确定了堆中对象的生存情况,也知道了哪些region里面大部分都是要回收的对象,g1会首先...

常见的垃圾收集器

gc

垃圾收集器选择 serial collector:-XX:+UseSerialGC;适合单处理器,小型数据场景的应用(小于100M)。 parallel collector: -XX:+UseParallelGC;并发线程执行gc,减少gc时间,提高吞吐量。算法与serial collector类似,不过他是并发执行。minor 和 major都是并发。适合多核中大型服务应用。 ...

ThreadPoolExecutor java线程池原理分享

并发

[TOC] ThreadPoolExecutor java线程池原理分享 ThreadPoolExcutor的创建 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAl...

堆内部是什么结构

jvm

堆内部结构大致分为 新生代 老年代 永久代在 JDK 8 之后就没有了 新生代 先说新生代,我们知道新生代主要分为一个Eden和两个Survior区。新生代是大部分对象创建和销毁的地方。新创建的对象,都会先放在Eden中。在GC的时候,就会将Eden中和其中一个当前Suivior(也称为From-Suivior)中存活的对象移动到另外一个空闲的Suivior(to-Su...

Java中的对象都是在堆中分配吗?(逃逸分析)

jvm

逃逸分析简单来讲就是,Java HotSpot虚拟机可以分析新创建对象的使用范围,并决定是否在Java堆上分配内存的一项技术。 先说结论,不一定,但是得看具体虚拟的实现方式。而Oracle Hotspot JVM中所有的对象就都是在堆上分配的。 然后来理解一下,这个问题问出来,就说明,对象可能不在堆上上分配,而这就利用到了逃逸分析这项技术。 就像前面定义所说,逃逸分析分析出来的...

类加载过程

jvm

一般来说,我们把 Java 的类加载过程分为三个主要步骤:加载、链接、初始化,具体行为在Java 虚拟机规范里有非常详细的定义。 首先是类加载阶段,它是java将字节码数据从不同的数据源读取倒JVM中,并映射为JVM认可的数据结构(Class对象),这里的数据源可能是各种各样的形态,如Jar文件,class文件,甚至ishi网络数据源等;如果输入数据不是ClassFile结构,则...

java thread中断

并发

Java 程序中有不止一条执行线程,只有当所有的线程都运行结束的时候,这个 Java 程序才算运行结束。 官方的话给你描述一下:当所有的非守护线程运行结束时,或者其中一个线程调用了 System.exit() 方法时,这个 Java 程序才能运行结束。 线程中断即线程运行过程中被其他线程给打断了,它与 stop 最大的区别是:stop 是由系统强制终止线程,而线程中断则是给目标线程发送一...

java并发包 java.util.concurrent提供的并发工具类

并发

[TOC] concurrent并发包 我们进行多线程编程,无非是要达到几个目的: 利用多线程提高程序的扩展能力,以达到业务对吞吐量的要求 协调线程间调度、交互、以完成业务逻辑 线程间传递数据和状态,这同样是实现业务逻辑的需要 对于并发包主要分为同步工具,线程安全容器,并发队列以及Executor框架,对于这些了解,应该做到 理解具体设计,实现和能力 深入掌握这些...

深入客户端

分区分配策略 RangeAssignor分配策略 默认分配策略,关注的是一个消费者组对应一个主题 该策略会保证分区尽可能均匀的分配给所有的消费者。会按照消费者的名称字典序排序,然后平均分配,如果不够,会给靠前的消费者多分配一个分区。 n = 分区数/消费者数量 m = 分区数%消费者数量 前m个消费者会分配n+1个分区,后面的消费者会分配n个分区 注意,这里的分区...