内存映射

NIO:Channel的map映射

让人想犯罪 __ 提交于 2019-12-10 19:32:18
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. 通道映射技术: 1) 其实就是一种快速读写技术,它将通道所连接的数据节点中的全部或部分数据直接映射到内存的一个Buffer中,而这个内存Buffer块就是节点数据的映像,你直接对这个Buffer进行修改会直接影响到节点数据,而这个Buffer也不是普通的Buffer,叫做MappedBuffer,即镜像Buffer,对该Buffer进行修改会直接影响到实际的节点(更新到节点); 2) 由于是内存镜像,因此处理速度非常快!! 3) map原型:MappedByteBuffer map(MapMode mode, long position, long size); // 将节点中从position开始的size个字节映射到返回的MappedByteBuffer中 4) mode印出来映射的三种模式,在这三种模式下得到的将是三种不同的MappedByteBuffer:三种模式都是Channel的内部类MapMode中定义的静态常量,这里以FileChannel举例 i. FileChannel.MapMode.READ_ONLY:得到的镜像只能读不能写(只能使用get之类的读取Buffer中的内容); ii. FileChannel.MapMode.READ_WRITE:得到的镜像可读可写(既然可写了必然可读

[Google Guava] 2.2-新集合类型

守給你的承諾、 提交于 2019-12-10 15:25:20
原文链接 译文链接 译者: 沈义扬,校对:丁一 Guava引入了很多JDK没有的、但我们发现明显有用的新集合类型。这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念。作为一般规则,Guava集合非常精准地遵循了JDK接口契约。 Multiset 统计一个词在文档中出现了多少次,传统的做法是这样的: 1 Map<String, Integer> counts = new HashMap<String, Integer>(); 2 for (String word : words) { 3 Integer count = counts.get(word); 4 if (count == null) { 5 counts.put(word, 1); 6 } else { 7 counts.put(word, count + 1); 8 } 9 } 这种写法很笨拙,也容易出错,并且不支持同时收集多种统计信息,如总词数。我们可以做的更好。 Guava提供了一个新集合类型 Multiset ,它可以多次添加相等的元素。维基百科从数学角度这样定义Multiset:”集合[set]概念的延伸,它的元素可以重复出现…与集合[set]相同而与元组[tuple]相反的是,Multiset元素的顺序是无关紧要的:Multiset {a, a, b}和{a, b, a}是相等的”。—

OS内存管理相关实现(原题: Linux中的内存管理)

风格不统一 提交于 2019-12-10 15:13:39
前一段时间看了《深入理解Linux内核》对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看法和认识。 我比较喜欢搞清楚一个技术本身的发展历程,简而言之就是这个技术是怎么发展而来的,在这个技术之前存在哪些技术,这些技术有哪些特点,为什么会被目前的技术所取代,而目前的技术又解决了之前的技术所存在的哪些问题。弄清楚了这些,我们才能比较清晰的把握某一项技术。有些资料在介绍某个概念的时候直接就介绍这个概念的意义,原理,而对其发展过程和背后的原理丝毫不提,仿佛这个技术从天上掉下来的一样。介于此,还是以内存管理的发展历程来讲述今天的主题。 首先,我必须要阐述一下这篇文章的主题是Linux内存管理中的分段和分页技术。 让我们来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的。换句话说,就是程序在运行的过程中访问的都是物理地址。如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内存就不会出现问题,我们也就不需要考虑内存管理这个麻烦事了,反正就你一个程序,就这么点内存,吃不吃得饱那是你的事情了。然而现在的系统都是支持多任务,多进程的,这样CPU以及其他硬件的利用率会更高,这个时候我们就要考虑到将系统内有限的物理内存如何及时有效的分配给多个程序了

19、共享内存mmap

不问归期 提交于 2019-12-10 05:33:12
1、特点: ① 进程相关的 ② 与 XSI 共享内存一样,需要与同步原语一起使用 ③ 只能是有共同祖先的进程才能使用 2、使用 系统调用 mmap() 用于共享内存的两种方式: ( 1 )使用普通文件提供的内存映射: 适用于任何进程之间。此时,需要打开或创建一个文件,然后再调用 mmap() 典型调用代码如下: fd=open(name, flag, mode); if(fd<0) ... ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP_SHARED , fd , 0); 通过 mmap() 实现共享内存的通信方式有许多特点和要注意的地方,可以参看 UNIX 网络编程第二卷。【 3 】 ( 2 )使用特殊文件提供匿名内存映射: 适用于具有亲缘关系的进程之间。由于父子进程特殊的亲缘关系,在父进程中先调用 mmap() ,然后调用 fork() 。那么在调用 fork() 之后,子进程继承父进程匿名映射后的地址空间,同样也继承 mmap() 返回的地址,这样,父子进程就可以通过映射区域进行通信了。一般来说,子进程单独维护从父进程继承下来的一些变量。而 mmap() 返回的地址,却由父子进程共同维护。 对于具有亲缘关系的进程实现共享内存最好的方式应该是采用匿名内存映射的方式 。此时,不必指定具体的文件,只要设置相应的标志即可。 3、说明 (1

FileChannel(API详解)

做~自己de王妃 提交于 2019-12-09 20:14:39
1、两种获取通道的方法 FileChannel.open()的方式 FileChannel channell = FileChannel.open(Paths.get("a.txt","c.txt"), StandardOpenOption.CREATE,StandardOpenOption.WRITE); FileChannel channel2 = FileChannel.open(new File("a.txt").toPath(), StandardOpenOption.CREATE_NEW,StandardOpenOption.WRITE,StandardOpenOption.READ); path获取 Paths.get() new File(“a.txt”).toPath() OpenOption接口的实现类通常由StandardOpenOption枚举进行代替。 public enum StandardOpenOption implements OpenOption { READ, WRITE, APPEND,//累加 TRUNCATE_EXISTING,//如果该文件已存在并且为写入访问而打开,则其长度将被截断为0。如果只为读取访问打开文件,则忽略此选项。 CREATE,//不能单独使用,要与WRITE配套使用,单独使用会报错java.nio.file

内存管理之程序内存分布

二次信任 提交于 2019-12-09 17:50:30
在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中。这个沙盘就是虚拟地址空间(virtual address space)。 1 32位虚拟内存布局 在32位模式下虚拟地址空间总是一个4GB的内存地址块。这些虚拟地址通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用。每一个进程拥有一套属于它自己的页表,但是还有一个隐情。只要虚拟地址被使用,那么它就会作用于这台机器上运行的所有软件,包括内核本身。因此一部分虚拟地址必须保留给内核使用: 图 1 这并不意味着内核使用了那么多的物理内存,仅表示它可支配这么大的地址空间,可根据内核需要,将其映射到物理内存。内核空间在页表中拥有较高的 特权级 (ring 2或以下),因此只要用户态的程序试图访问这些页,就会导致一个页错误(page fault),用户程序不可访问内核页。在Linux中,内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。内核代码和数据总是可寻址的,随时准备处理中断和系统调用。与此相反,用户模式地址空间的映射随进程切换的发生而不断变化: 图 2 图2中,蓝色区域表示映射到物理内存的虚拟地址,而白色区域表示未映射的部分。在上面的例子中,Firefox使用了相当多的虚拟地址空间,因为它是传说中的吃内存大户。地址空间中的各个条带对应于不同的内存段(memory segment),如

Linux kernel device mapper

为君一笑 提交于 2019-12-09 14:26:35
Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构,如图 1。 图1 Device Mapper的内核体系架构 在内核中它通过一个一个模块化的 target driver 插件实现对 IO 请求的过滤或者重新定向等工作,当前已经实现的 target driver 插件包括软 raid、软加密、逻辑卷条带、多路径、镜像、快照等,图中 linear、mirror、snapshot、multipath 表示的就是这些 target driver。Device mapper 进一步体现了在 Linux 内核设计中策略和机制分离的原则,将所有与策略相关的工作放到用户空间完成,内核中主要提供完成这些策略所需要的机制。Device mapper 用户空间相关部分主要负责配置具体的策略和控制逻辑,比如逻辑设备和哪些物理设备建立映射,怎么建立这些映射关系等等,而具体过滤和重定向 IO 请求的工作由内核中相关代码完成。因此整个 device mapper 机制由两部分组成--内核空间的 device mapper 驱动、用户空间的device mapper 库以及它提供的 dmsetup 工具。在下文中,我们分内核和用户空间两部分进行介绍。 内核部分 Device mapper

JPA注解大全详解参考手册

♀尐吖头ヾ 提交于 2019-12-09 10:47:37
JPA注释详解参考手册 JPA和Hibernate的关系 JPA(Java Persistence API) ,是Java EE 5的标准ORM接口,也是ejb3规范的一部分。 Hibernate 是之前很流行的ORM框架,也是JPA的一个实现,其它还有Toplink之类的ROM框架。 JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。 Hibernate主要是通过三个组件来实现的: hibernate-core :Hibernate的核心实现,提供了Hibernate所有的核心功能。 hibernate-entitymanager :Hibernate实现了标准的JPA,可以把它看成hibernate-core和JPA之间的适配器,它并不直接提供ORM的功能,而是对hibernate-core进行封装,使得Hibernate符合JPA的规范。 hibernate-annotation :Hibernate支持annotation方式配置的基础,它包括了标准的JPA annotation以及Hibernate自身特殊功能的annotation。 Entity @Entity说明这个class是实体类,并且使用默认的orm规则,即class名对应数据库表中表名,class字段名即表中的字段名。 (如果想改变这种默认的orm规则,就要使用

Mybatis常见面试题总结

半城伤御伤魂 提交于 2019-12-09 01:55:10
1、什么是Mybatis? (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。 (2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 (3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。 2、Mybaits的优点: (1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。 (2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接; (3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。 (4)

海量数据处理-面试题

白昼怎懂夜的黑 提交于 2019-12-08 19:07:54
何谓海量数据处理? 所谓海量数据处理,就是基于海量数据上的存储、处理、操作。何谓海量,要么就是数据量太大导致无法在短时间内迅速解决。要么就是数据太大,导致无法一次性装入内存。 针对时间,我们可以采用恰当的算法搭配合适的数据结构,例如Bloom filter、Hash、bit-map、堆、数据库索引等。 针对空间,我们可以采用分治的思想,将大规模问题化为小规模问题,各个击破。 针对单机资源受限问题,可以考虑集群。 海量数据处理方法论 1、分治/hash映射+hashmap统计+堆/快速/归并排序 2.、桶划分 3.、Bloom filter/Bitmap 4、trie树、数据库索引 5、外排序 6、分布式处理hadoop/Mapreduce 海量数据 (有重复), 统计重复次数最多的一个? 海量日志数据,提取出某日访问百度次数最多的那个IP。 方案一:hash映射+hashmap统计 1、首先从日志文件中将这一天访问百度的所有IP取出来放入另一个大文件中。 2、分而治之/hash映射:IP是32位的,最多2^32个IP,我们可以通过哈希函数(IP%1024)将大文件映射为1024个小文件。 3、hashmap统计:对每一个小文件,我们直接在内存中通过hashmap统计IP的频率,并保存出现频率最高IP。 4、最后从这1024个频率最高IP中找到全局频率最高的那个IP。 海量数据