Java实现滑动时间窗口限流
直接上代码 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455package demo;import java.time.LocalDateTime;import java.util.LinkedList;import java.util.Random;/** * @author weylan */public class SlideWindow { static LinkedList<long> timeWindow = new LinkedList<>(); /** * 滑动时间窗口限流算法 * 在指定时间窗口,指定限制次数内,是否允许通过 * * @param windowSize 时间窗口大小,单位 秒 * @param count 允许通过的次数 * @return 是否允许通过 */ public...
深入学习G1垃圾收集器
G1 (Garbage-First) 垃圾收集器在是Java9的默认垃圾收集器。G1 的主要关注点在于达到可控的停顿时间,在这个基础上尽可能提高吞吐量。 如果你的应用使用了较大的堆(如 6GB 及以上)而且还要求有较低的垃圾收集停顿时间(如 0.5 秒),那么 G1 是你绝佳的选择。 从分代上看,G1依然属于分代垃圾回收器,它会区分年代和老年代,依然有eden和survivor区,但从堆的结构上看,它并不要求整个eden区、年轻代或者老年代都连续。 分代收集器将堆分为年轻代、老年代和永久代,每个代空间都是确定的。 而 G1 将整个堆划分为一个个大小相等的小块(每一块称为一个 region),在jvm启动时会设置 region 的数量,取决于堆的大小,每个 region 的大小可在 1MB ~ 32 MB调整,最好不要超过2048个 region 。和分代算法一样,G1 中每个块也会充当 Eden、Survivor、Old 三种角色,但是它们不是固定的,这使得内存使用更加地灵活。 执行垃圾收集时,和 CMS 一样,G1...
Java基本容器底层原理分析
概述容器主要包括 Collection 和 Map 两种,Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。 CollectionList ArrayList:基于动态数组实现,支持随机访问。 LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。 Vector:和 ArrayList 类似,但它是线程安全的。 Set HashSet:基于哈希表实现,支持快速查找,但不支持有序性操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。 TreeSet:基于红黑树实现,支持有序性操作,例如根据一个范围查找元素的操作。但是查找效率不如 HashSet,HashSet 查找的时间复杂度为 O(1),TreeSet 则为 O(logN)。 LinkedHashSet:具有 HashSet...
深入学习jvm与垃圾回收
一、 Java内存区域常见面试题 介绍下 Java 内存区域(运行时数据区) Java 对象的创建过程(五步,建议能默写出来并且要知道每一步虚拟机做了什么) 对象的访问定位的两种方式(句柄和直接指针两种方式) String 类和常量池 8 种基本类型的包装类和常量池 1. 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。JDK. 1.8 和之前的版本略有不同。 JVM 内存区域主要分为线程私有区域【程序计数器、虚拟机栈、本地方法区】、线程共享区域【JAVA 堆、方法区】、直接内存。线程私有数据区域生命周期与线程相同, 依赖用户线程的 启动/结束 而 创建/销毁 (在 Hotspot VM 内, 每个线程都与操作系统的本地线程直接映射, 因此这部分内存区域的存/否跟随本地线程的生/死对应)。 1.1程序计数器(线程私有)一块较小的内存空间, 是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。正在执行 java...