探究HashMap1.8的扩容】的更多相关文章

扩容前 扩容后 机制 else { // preserve order Node<K,V> loHead = null, loTail = null;//低指针 Node<K,V> hiHead = null, hiTail = null;//高指针 Node<K,V> next; do {//采用尾插法,与1.7头插法不同,不会产生环 next = e.next; //属于低链表 if ((e.hash & oldCap) == 0) { if (loTail…
本文基于JDK-8u261源码分析 本文原创首发于 奇客时间(qiketime) 1 简介 HashMap是一个使用非常频繁的键值对形式的工具类,其使用起来十分方便.但是需要注意的是,HashMap不是线程安全的,线程安全的是ConcurrentHashMap(Hashtable这种过时的工具类就不要再提了),在Spring框架中也会用到HashMap和ConcurrentHashMap来做各种缓存.从Java 8开始,HashMap的源码做了一定的修改,以此来提升其性能.首先来看一下HashM…
摘要 ArrayList 是Java中常用的一个集合类,其继承自AbstractList并实现了List 构造器 ArrayList 提供了三个构造器,分别是 含参构造器-1 // 含参构造器-1 // 参数含义: 初始化线性表容量 public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initial…
“你定义了那么多全局变量,系统才给你分配了几百KB,这样做是不是太耗内存了?”,一同学问道. 老早就听说嵌入式系统各种资源有限啊,不能分配大空间啊要注意节约资源之类的(...貌似米神4的配置要完爆我的thinkpad了...).那是不是全局变量的使用真的会占用很大系统内存,而系统真的才分配几百KB空间给我呢? 我不信,所以我要尝试一下: 全局变量,肯定是要占用内存的,但无论是不是全局变量,只要是已定义的变量都会占用内存,这个和是否是全局的没啥关系,只是占用的区域不一样而已(详见APUE存储器安排…
来来来,今天就跟hashmap杠到底... 不要叫我杠精了,主要是还是被问到hashmap的时候,我并不能很清晰明了得告知这种数据结构到底是一个什么构造,里面细节并不了解 既然这样,我们就把他解析一波,今天这篇也算是hashmap的收官之作了,主要用来红黑树部分我之前有博文写过,但是不用深究 自己实现一个hashmap 话不多说,直接上代码,我先把这几天的成就放上来,也就是自己实现的hashmap,还原到以前的版本,我把红黑树的部分代码给删除了 package y2019.collection;…
开始之前 在开始之前先记录一个我碰到的jvm调优的坑.那就是… 为啥我配置到idea64exe.vmoptions中的参数没有生效??? 由于之前一直是在mac上开发,本地开发时当需要优化jvm参数的时候直接去idea的安装目录里修改idea.vmoptions就可以了,换到windows以后想当然的也这么改,但是发现似乎我配置的参数并没有生效, what‘s the f***?探索了一番终于发现了问题所在. windows是基于用户登录的,idea会为每个用户在当前用户根目录下创建一份配置信息…
前言 之前的文章有说过 Atomic 原子操作的原理,其作为一个特殊的修饰前缀,影响了存取操作. 在属性修饰定义中,还有另一类修饰前缀,他们分别是 strong weak assign copy,这些又有什么区别呢? 平时喜欢探究的同学,可能也见过 unsafe_unretained,这个又是什么呢? 让我们从属性修饰入手,逐步揭开弱引用的面纱. 原理 属性自动生成的实现方法是怎么样的? 首先我们先创建一个示例代码文件作为样本. #import <Foundation/Foundation.h>…
很早就知道在多线程环境中,HashMap不安全,应该使用ConcurrentHashMap等并发安全的容器代替,对于ConcurrentHashMap也有一定的了解,但是由于没有深入到源码层面,很多理解都是浮于表面,稍微深一点的东西就不是很懂.这两天终于下定决心将ConcurrentHashMap的源码探究了一遍,记录一下心得体会,算是对阅读源码的一个总结吧.需要提醒读者注意,因为个人水平有限,且本文本质上来讲是留给未来的自己进行查阅的总结,所以难免会有错漏,一经发现,本人会尽快纠正,也欢迎大家…
一:背景 1. 讲故事 自从这个纯内存项目进了大客户之后,搞得我现在对内存和CPU特别敏感,跑一点数据内存几个G的上下,特别没有安全感,总想用windbg抓几个dump看看到底是哪一块导致的,是我的代码还是同事的代码? 很多看过我博客的老朋友总是留言让我出一套windbg的系列或者视频,我也不会呀,没办法,人在江湖飘,迟早得挨上几刀,逼着也得会几个花架子,废话不多说,这一篇就来看看 HashSet 是如何扩容的. 二:HashSet的扩容机制 1. 如何查看 了解如何扩容,最好的办法就是翻看Ha…
前面一篇已经介绍过了 HashMap 的源码: HashMap源码解析.jdk7和8之后的区别.相关问题分析 HashMap并不是线程安全的,他就一个普通的容器,没有做相关的同步处理,因此线程不安全主要体现在: put.get 等等核心方法在多线程情况下,都会出现修改的覆盖,数据不一致等等问题.比如多个线程 put 先后的问题,会导致结果覆盖,如果一个 put 一个get,也可能会因为调度问题获取到错误的结果: 多线程操作有读有写的时候,可能会出现一个典型异常:ConcurrentModific…
一.先从 ArrayList 的构造函数说起 ArrayList有三种方式来初始化,构造方法源码如下: 1 /** 2 * 默认初始容量大小 3 */ 4 private static final int DEFAULT_CAPACITY = 10; 5 6 7 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; 8 9 /** 10 *默认构造函数,使用初始容量10构造一个空列表(无参数构造) 11 */…
列表 Python中的列表(list)是最常用的数据类型之一. Python中的列表可以存储任意类型的数据,这与其他语言中的数组(array)不同. 被存入列表中的内容可称之为元素(element)或者数据项(data item)亦或是值(value). 虽然Python列表支持存储任意类型的数据项,但不建议这么做,事实上这么做的概率也很低. 列表特性 列表的特点: 列表属于容器序列 列表属于可变类型,即对象本身的属性会根据外部变化而变化,例如长度 列表底层由顺序存储组成,而顺序存储是线性结构的…
元组 Python中的元组容器序列(tuple)与列表容器序列(list)具有极大的相似之处,因此也常被称为不可变的列表. 但是两者之间也有很多的差距,元组侧重于数据的展示,而列表侧重于数据的存储与操作. 它们非常相似,虽然都可以存储任意类型的数据,但是一个元组定义好之后就不能够再进行修改. 元组特性 元组的特点: 元组属于容器序列 元组属于不可变类型 元组底层由顺序存储组成,而顺序存储是线性结构的一种 基本声明 以下是使用类实例化的形式进行对象声明: tup = tuple((1, 2, 3,…
ArrayList是我们开发中最常用到的集合,但是很多人对它的源码并不了解,导致面试时,面试官问的稍微深入的问题,就无法作答,今天我们一起来探究一下ArrayList源码. 1. 简介 ArrayList底层是数组,允许元素是null,能够动态扩容 size.isEmpty.get.set.add 等方法时间复杂度都是 O (1) 非线程安全,并发修改时,会抛出ConcurrentModificationException 2. 初始化 // 初始容量 private static final…
ArrayList分析1-循环.扩容.版本 转载请注明出处 https://www.cnblogs.com/funnyzpc/p/16407733.html 前段时间抽空看了下ArrayList的源码,发现了一些有意思的东东,真的是大受裨益哈,尤其是版本问题 所以,本篇博客开始我将大概分三篇讲讲ArrayList里面一些有意思的点哈,由于源码大概一千八百逾行,里面大多代码都很通俗,也有些部分存在重复的(Itr以及SubList的内部方法),因为大多通俗遂这里不会逐行的分析哈,好了,现在开始- 一…
前言 在本次案例中,我们的中台技术工程师遇到了来自客户提出的打破k8s产品功能限制的特殊需求,面对这个极具挑战的任务,攻城狮最终是否克服了重重困难,帮助客户完美实现了需求?且看本期K8S技术案例分享! (友情提示:文章篇幅较长,建议各位看官先收藏再阅读,同时在阅读过程中注意劳逸结合,保持身心健康!) 第一部分:"颇有个性"的需求 某日,我们的技术中台工程师接到了客户的求助.客户在云上环境使用了托管K8S集群产品部署测试集群.因业务需要,研发同事需要在办公网环境能直接访问K8S集群的cl…
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来存储数据有什么不同.于是,我打算探究探究. 一.掌握三种数据类型 首先,一个前提必须掌握的,就是必须理解javascript的数据类型分类,主要分为以下三种: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二…
KVM 虚拟化原理探究- overview 标签(空格分隔): KVM 写在前面的话 本文不介绍kvm和qemu的基本安装操作,希望读者具有一定的KVM实践经验.同时希望借此系列博客,能够对KVM底层有一些清晰直观的认识,当然我没有通读KVM的源码,文中的内容一部分来自于书籍和资料,一部分来自于实践,还有一些来自于自己的理解,肯定会有一些理解的偏差,欢迎讨论并指正.本系列文章敬代表我个人观点和实践,不代表公司层面. KVM虚拟化简介 KVM 全称 kernel-based virtual mac…
背景: 原先的物理机环境多是若干块物理磁盘经过RAID卡进行了RAID5之后的虚拟磁盘组,这样我们在操作系统内看到的也就是一块完整的磁盘.我们会在上面进行分区,然后格式化后以便使用. Figure 1这个时候的磁盘看起来一般会是这样的 这种磁盘结构使用了分区进行了存储结构的规划,但是在虚拟化环境中,这样的磁盘结构会给每个独立分区进行扩容带来各种不便,比如我们只能相对方便一些的对E盘进行扩充,而C盘和D盘的扩充就会变得非常麻烦. 思路变更: 有了上面诸多不便,在P2V之后的虚拟化环境中我们可以通过…
KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CPU 虚拟化 KVM 虚拟化原理探究(4)- 内存虚拟化 KVM 虚拟化原理探究(5)- 网络IO虚拟化 KVM 虚拟化原理探究(6)- 块设备IO虚拟化…
KVM 虚拟化原理探究(6)- 块设备IO虚拟化 标签(空格分隔): KVM [toc] 块设备IO虚拟化简介 上一篇文章讲到了网络IO虚拟化,作为另外一个重要的虚拟化资源,块设备IO的虚拟化也是同样非常重要的.同网络IO虚拟化类似,块设备IO也有全虚拟化和virtio的虚拟化方式(virtio-blk).现代块设备的工作模式都是基于DMA的方式,所以全虚拟化的方式和网络设备的方式接近,同样的virtio-blk的虚拟化方式和virtio-net的设计方式也是一样,只是在virtio backe…
KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输入计算输出这个步骤.传统的IO包括了网络设备IO,块设备IO,字符设备IO等等,在KVM虚拟化原理探究里面,我们最主要介绍网络设备IO和块设备IO,其实他们的原理都很像,但是在虚拟化层又分化开了,这也是为什么网络设备IO虚拟化和块设备IO虚拟化要分开讲的原因.这一章介绍一下网络设备IO虚拟化,下一章…
KVM 虚拟化原理探究(4)- 内存虚拟化 标签(空格分隔): KVM 内存虚拟化简介 前一章介绍了CPU虚拟化的内容,这一章介绍一下KVM的内存虚拟化原理.可以说内存是除了CPU外最重要的组件,Guest最终使用的还是宿主机的内存,所以内存虚拟化其实就是关于如何做Guest到宿主机物理内存之间的各种地址转换,如何转换会让转换效率更高呢,KVM经历了三代的内存虚拟化技术,大大加快了内存的访问速率. 传统的地址转换 在保护模式下,普通的应用进程使用的都是自己的虚拟地址空间,一个64位的机器上的每一…
KVM 虚拟化原理探究(3)- CPU 虚拟化 标签(空格分隔): KVM [TOC] CPU 虚拟化简介 上一篇文章笼统的介绍了一个虚拟机的诞生过程,从demo中也可以看到,运行一个虚拟机再也不需要像以前想象的那样,需要用软件来模拟硬件指令集了.虚拟机的指令集直接运行在宿主机物理CPU上,当虚拟机中的指令设计到IO操作或者一些特殊指令的时候,控制权转让给了宿主机(这里其实是转让给了vm monitor,下面检查VMM),也就是一个demo进程,他在宿主机上的表现形式也就是一个用户级进程. 用一…
KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_RDWR); 第二步,创建虚拟机,获取到虚拟机句柄. vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0); 第三步,为虚拟机映射内存,还有其他的PCI,信号处理的初始化. ioctl(kvmfd, KVM_SET_USER_MEMORY_REGION, &mem); 第四步,将…
打算给系统装一个oracle,发现磁盘空间不足.在安装系统的时候我选择的是自动分区,系统就会自动以LVM的方式分区.为了保证系统后期的可用性,建议所有新系统安装都采用LVM,之后生产上的设备我也打算这样做. 参于LVM基本介绍与常用命令请参考:http://www.cnblogs.com/jackruicao/p/6258812.html LVM结构图 扩容之前的磁盘状况 [root@localhost ~]# df -h 文件系统             容量 已用 可用已用%%挂载点 /de…
VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容 一般来说,在对虚拟机里的Ubuntu下的磁盘进行扩容时,都是添加新的分区,而并不是对其系统所在分区进行扩容,如在此链接中http://www.cnblogs.com/yiru/archive/2012/11/15/2770968.html 就是添加了新的分区.但是我们平时自动安装一些软件或者库,都会自动安装在系统所在分区/dev/sda1里面,很不方便,今天查了相关资料,找到一种可以扩充/dev/sda1的方法,顺便在此记录…
相关插件的引用: grunt-usemin  对页面的操作 grunt-contrib-cssmin  压缩css load-grunt-tasks 瘦身gruntfile grunt-rev给md5加密 实际的使用场景:压缩css文件到指定目录,并且更改页面引用的外链(这里以css为例). 情景一:html页面与要操作的css在同一目录下,且也与操作后的css在同一目录下. **这里使用npm中的注释方式来操作外链的,扩展性很不好. Gruntfile.js内容如下: module.expor…
需求: 将3个节点的Vertica集群扩容,额外增加3个节点,即扩展到6个节点的Vertica集群. 实验环境: RHEL 6.5 + Vertica 7.2.2-2 步骤: 1.三节点Vertica集群环境创建 2.模拟创建业务最小测试用例 3.集群扩容前准备 4.集群扩容:增加3个节点到集群 Reference 1.三节点Vertica集群环境创建 三节点IP地址和主机名规划: 192.168.56.121 vnode01 192.168.56.122 vnode02 192.168.56.…
环境:RHEL 6.5 + GI 11.2.0.4 + Oracle 11.2.0.4 1.确认磁盘权限正确 2.图形界面配置 3.启用asmca配置 4.修改磁盘组rebalance power级别 5.监控磁盘组rebalance完成情况 1.确认磁盘权限正确 如果是RAC,需要确认各个节点都认出磁盘,且权限正确. 一般磁盘是grid:asmadmin属主,660权限. 2.图形界面配置 直接使用VNC,稳定: 或者使用Secure CRT + Xmanager4 passive模式 需要注…