Entry

Linux 匿名页的反向映射

可紊 提交于 2020-10-28 04:55:17
我们知道LINUX的内存管理系统中有”反向映射“这一说,目的是为了快速去查找出一个特定的物理页在哪些进程中被映射到了什么地址,这样如果我们想把这一页换出(SWAP),或是迁移(Migrate)的时候,就能相应该更改所有相关进程的页表来达到这个目的。 1、为什么要使用反向映射   物理内存的分页机制,一个PTE(Page Table Entry)对应一个物理页,但一个物理页可以由多个PTE与之相对应,当该页要被回收时,Linux2.4的做法是遍历每个进程的所有PTE判断该PTE是否与该页建立了映射,如果建立则取消该映射,最后无PTE与该相关联后才回收该页。该方法显而易见效率极低,因为其为了查找某个页的关联PTE遍历了所有的PTE,我们不禁想:如果把每个页关联的PTE保存在页结构里面,每次只需要访问那些与之相关联的PTE不很方便吗?确实,2.4之后确实采用过此方法,为每个页结构(Page)维护一个链表,这样确实节省了时间,但此链表所占用的空间及维护此链表的代价很大,在2.6中弃之不用,但反向映射机制的思想不过如此,所以还是有参考价值的,可以参考: http://blog.csdn.net/dog250/article/details/5303581 。 2、Linux2.6中是如何实现反向映射 2.1 与RM(Reverse Mapping)相关的结构 page , address

Java中Set集合是如何实现添加元素保证不重复的?

给你一囗甜甜゛ 提交于 2020-10-27 19:42:51
Java中Set集合是如何实现添加元素保证不重复的? Set集合是一个无序的不可以重复的集合。今天来看一下为什么不可以重复。 Set是一个接口,最常用的实现类就是HashSet,今天我们就拿HashSet为例。 先简单介绍一下HashSet类 HashSet类实现了Set接口, 其底层其实是包装了一个HashMap去实现的。HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能。 先看下HashSet的几个构造方法。 // 默认构造函数 底层创建一个HashMap public HashSet() { // 调用HashMap的默认构造函数,创建map map = new HashMap<E,Object>(); } // 带集合的构造函数 public HashSet(Collection<? extends E> c) { // 创建map。 map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16)); // 将集合(c)中的全部元素添加到HashSet中 addAll(c); } // 指定HashSet初始容量和加载因子的构造函数 public HashSet(int initialCapacity, float loadFactor) { map = new

阿里 双11 同款,流量防卫兵 Sentinel go 源码解读

*爱你&永不变心* 提交于 2020-10-27 12:47:51
简介: 本文主要分析阿里巴巴集团开源的流量控制中间件 Sentinel,其原生支持了 Java/Go/C++ 等多种语言,本文仅仅分析其 Go 语言实现。下文如无特殊说明,sentinel 指代 Sentinel-Go。 作者 | 于雨 apache/dubbo-go 项目负责人 本文作者系 apache/dubbo-go 项目负责人,目前在 dubbogo 项目中已内置可用 sentinel-go,如果想单独使用可参考 在 dubbo-go 中使用 sentinel 一文,若有其他疑问可进 dubbogo社区【钉钉群 23331795】进行沟通。 导读 :本文主要分析阿里巴巴集团开源的流量控制中间件 Sentinel,其原生支持了 Java/Go/C++ 等多种语言,本文仅仅分析其 Go 语言实现。下文如无特殊说明,sentinel 指代 Sentinel-Go。 1 基本概念 Resource 和 Rule 1.1 Resource // ResourceType represents classification of the resources type ResourceType int32 const ( ResTypeCommon ResourceType = iota ResTypeWeb ResTypeRPC ) // TrafficType describes

深入理解Java编程性能调优——深入浅出HashMap的设计与优化

Deadly 提交于 2020-10-27 08:24:19
HashMap 作为我们日常使用最频繁的容器之一,相信你一定不陌生了。今天我们就从HashMap 的底层实现讲起,深度了解下它的设计与优化。 常用的数据结构 我在 05 讲分享 List 集合类的时候,讲过 ArrayList 是基于数组的数据结构实现的,LinkedList 是基于链表的数据结构实现的,而我今天要讲的 HashMap 是基于哈希表的数据结构实现的。我们不妨一起来温习下常用的数据结构,这样也有助于你更好地理解后面地内容。 数组 :采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为 O(1),但在数组中间以及头部插入数据时,需要复制移动后面的元素。 链表 :一种在物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素)组成,结点可以在运行时动态生成。每个结点都包含“存储数据单元的数据域”和“存储下一个结点地址的指针域”这两个部分。 由于链表不用必须按顺序存储,所以链表在插入的时候可以达到 O(1) 的复杂度,但查找一个结点或者访问特定编号的结点需要 O(n) 的时间。 哈希表 :根据关键码值(Key value)直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组就叫做哈希表。 树 :由 n(n≥1

Map集合循环遍历的几种方式

无人久伴 提交于 2020-10-27 04:54:31
package cn.jdbc.test; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; /** * Map 集合的循环遍历 * @data 2018.1.21 * */ public class TestMap { public static void main(String[] args) { Map<String, Object> map = new HashMap<String, Object>(); map.put("aaa", 111); map.put("bbb", 222); map.put("ccc", 333); map.put("ddd", 444); //Map集合循环遍历方式一 System.out.println("第一种:通过Map.keySet()遍历key和value:"); for(String key:map.keySet()){//keySet获取map集合key的集合 然后在遍历key即可 String value = map.get(key).toString();// System.out.println("key:"+key+" vlaue:"+value); } /

[源码解析]HashMap和HashTable的区别(源码分析解读)

匆匆过客 提交于 2020-10-26 13:49:08
[源码解析]HashMap和HashTable的区别(源码分析解读) 前言: 又是一个大好的周末, 可惜今天起来有点晚, 扒开HashMap和HashTable, 看看他们到底有什么区别吧. 先来一段比较拗口的定义: Hashtable 的实例有两个参数影响其性能: 初始容量 和 加载因子 。容量 是哈希表中桶 的数量,初始容量 就是哈希表创建时的容量。注意,哈希表的状态为 open:在发生“哈希冲突”的情况下,单个桶会存储多个条目,这些条目必须按顺序搜索。加载因子 是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加载因子这两个参数只是对该实现的提示。关于何时以及是否调用 rehash 方法的具体细节则依赖于该实现。 而HashTable是 基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作, 并允许使用 null 值和 null 键。 (除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。) 此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 此实现假定哈希函数将元素适 当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性能。迭代 collection 视图所需的时间与 HashMap 实例的“容量”(桶的数量)及其大小(键-值映射关系数)成比例。所以,如果迭代性能很重要,则不要将初始容量设置得太高

阿里 双11 同款,流量防卫兵 Sentinel go 源码解读

我与影子孤独终老i 提交于 2020-10-26 11:28:01
简介: 本文主要分析阿里巴巴集团开源的流量控制中间件 Sentinel,其原生支持了 Java/Go/C++ 等多种语言,本文仅仅分析其 Go 语言实现。下文如无特殊说明,sentinel 指代 Sentinel-Go。 作者 | 于雨 apache/dubbo-go 项目负责人 本文作者系 apache/dubbo-go 项目负责人,目前在 dubbogo 项目中已内置可用 sentinel-go,如果想单独使用可参考 在 dubbo-go 中使用 sentinel 一文,若有其他疑问可进 dubbogo社区【钉钉群 23331795】进行沟通。 导读 :本文主要分析阿里巴巴集团开源的流量控制中间件 Sentinel,其原生支持了 Java/Go/C++ 等多种语言,本文仅仅分析其 Go 语言实现。下文如无特殊说明,sentinel 指代 Sentinel-Go。 1 基本概念 Resource 和 Rule 1.1 Resource // ResourceType represents classification of the resources type ResourceType int32 const ( ResTypeCommon ResourceType = iota ResTypeWeb ResTypeRPC ) // TrafficType describes

Spring扩展的集合LinkedMultiValueMap和ConcurrentReferenceHashMap解析

半腔热情 提交于 2020-10-26 05:40:16
MultiValueMap是一个接口,它的一个键可以对应多个值(列表) public interface MultiValueMap< K , V > extends Map< K , List< V >> { /** * 获取key的第一个值 */ @Nullable V getFirst ( K key) ; /** * 添加value到key对应值的列表中 */ void add ( K key , @Nullable V value) ; /** * 添加一个列表到key对应的值中 */ void addAll ( K key , List<? extends V > values) ; /** * 添加另一个 MultiValueMap到本对象中 */ void addAll (MultiValueMap< K , V > values) ; /** * 给key设置一个给定的值value */ void set ( K key , @Nullable V value) ; /** * 将Map所有key,value设置进去 */ void setAll (Map< K , V > values) ; /** * 转化为一个单值Map */ Map< K , V > toSingleValueMap () ; } 该接口的实现类为LinkedMultiValueMap

关于java调用浏览器下载sqllite db文件的后续及zip压缩代码

試著忘記壹切 提交于 2020-10-26 05:13:36
说明 : 刚写一篇关于导出db文件为sql脚本的文章 -- https://my.oschina.net/u/3774949/blog/4470489 但是如果数据量特别大的话就可能很慢,原来是因为导出db文件乱码所以想解析数据库并生成sql脚本方式, 就在刚刚破案了 ,果不其然确实是前端js部分出了问题 先把前端代码贴出来吧 // 按说blob和 arraybuffer都是一样处理二进制的但是看了下介绍说arraybuffer比 blob更贴近原型 axios ({ url : '/api/backups/backupsDownLoad' , method : 'GET' , responseType: 'arraybuffer' , params : { name : backups. name } }). then ((res) => { console . log (res) const content = res. data const blob = new Blob ([ content ], { type : "application/octet-stream" }) let fileName = backups. name . substring ( 0 , backups. name . indexOf ( "." )) + ".db" ; if (

046. 使用 Java 实现一个简单的内存缓存

巧了我就是萌 提交于 2020-10-25 07:50:49
1. 场景 在 Java 应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中。相对从数据库中读取来说,读缓存效率会有很大提升。 在集群环境下,常用的分布式缓存有 Redis、Memcached 等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存(LocalCache)。 2. 方案 基于 JSR107 规范自研。 基于 ConcurrentHashMap 实现数据缓存。 3. JSR107 规范 文档: https://jcp.org/en/jsr/detail?id=107(了解一下就行,没太大的应用) 目标 为应用程序提供缓存 Java 对象的功能。 定义了一套通用的缓存概念和工具。 最小化开发人员使用缓存的学习成本。 最大化应用程序在使用不同缓存实现之间的可移植性。 支持进程内和分布式的缓存实现。 核心概念 Java Caching 定义了 5 个核心接口,分别是 CachingProvider、CacheManager、Cache、Entry 和 Expiry。 CachingProvider 定义了创建、配置、获取、管理和控制多个 CacheManager。一个应用可以在运行期间访问多个 CachingProvider。 CacheManager 定义了创建、配置、获取、管理和控制多个唯一命名的