内存映射

分区表理论解析

邮差的信 提交于 2020-03-21 06:37:35
在谈论分区表这个话题之前,先和大家分享一个案例: 2008 年秋天的某天,我的团队接到成都市 XX 局一个 SQL 调优的 ESS 单子。客户反映查询统计一次各地市局上报的数据汇总,需要 6 到 15 秒才能获得真正想要的数据,当我和销售人员赶到客户数据中心现场后,发现里面布置了很多柜式服务器,每台服务器都是 8 核 16G 内存。和相关技术负责人沟通以及演示业务系统之后,可以肯定不是服务器性能的问题,我详细分析了他们的数据库,统计慢的几张表往往一周的上报数据便会增加 1 百多万行,导致他们这个系统刚上线没多久,某些表产生的数据已经在 2000 万行以上,最终我提出了优化方案,业务逻辑层采用存储过程代替普通的 SQL 语句,并启用相关开发平台的缓存技术;数据库系统中采用增强索引和规划分区表进行优化,最终问题解决。 事实上数据库性能优化是每个优秀的数据库工程师必须具备的素质之一,而这一节讨论的分区表便是性能调优的一种技术。在企业级应用系统中,一个表存储 2 千万行的数据很常见,不可预期的数据也会在逐渐增长,所以数千万级别的表 DBA 会常常碰到,而 TB 级别的数据最终也在所难免,因此了解和掌握性能调优的 18 般兵器非常重要。 我计划用三篇博文介绍分区表这个主题,分别为: 1, 分区表理论解析 2, 实战分区表 3, 分区表前传 大凡在应用系统和数据库系统中行走江湖多年的朋友

Java HashMap实现原理分析

末鹿安然 提交于 2020-03-13 09:20:18
参考链接:https://www.cnblogs.com/xiarongjin/p/8310011.html 1. HashMap的数据结构 数据结构 中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难; 链表 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。 链表 的特点是:寻址困难,插入和删除容易。 哈希表 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。   哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“ 链表的数组 ” ,如图:   从上图我们可以发现哈希表是由 数组+链表 组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28

Autosar知识:方法论-内存映射

最后都变了- 提交于 2020-03-12 07:38:37
这个用例提供了定义、配置和生成头文件所需任务的全面视图,这些头文件用于内存映射和与内存相关的编译器抽象。基本概念在《内存映射》和《编译器抽象》中指定。 数据和代码的内存部分: AUTOSAR基本软件和应用程序软件 使用标准化的预处理器机制来为它们的数据和代码定义内存段 ,以及编译器全局定义的或每个段定义的内存类。这种机制的目标是将编译器特定的语句和ECU特定的映射与主代码分开维护。 使用AUTOSAR可以从XML工件派生(即生成)这些头文件的内容。这个用例显示了所需的工件和任务是如何相关的。 工作流程: 下图显示了为这个用例假设的工作序列,以及方法库所涉及的任务和工作产品。 请注意,此用例以代码编译结束。将内存段分配给实际硬件(通常由链接器的配置完成)目前不被认为是AUTOSAR方法的一部分。 用例:内存映射 内存映射的细节和工件 编译器配置的细节和工件 来源: CSDN 作者: MichaelMCFD 链接: https://blog.csdn.net/MichaelMCFD/article/details/104804504

mybatis与hibernate对比

拥有回忆 提交于 2020-03-12 04:54:53
第一方面:开发速度的对比 就开发速度而言,Hibernate的真正掌握要比Mybatis来得难些。Mybatis框架相对简单很容易上手,但也相对简陋些。个人觉得要用好Mybatis还是首先要先理解好Hibernate。 比起两者的开发速度,不仅仅要考虑到两者的特性及性能,更要根据项目需求去考虑究竟哪一个更适合项目开发,比如:一个项目中用到的复杂查询基本没有,就是简单的增删改查,这样选择hibernate效率就很快了,因为基本的sql语句已经被封装好了,根本不需要你去写sql语句,这就节省了大量的时间,但是对于一个大型项目,复杂语句较多,这样再去选择hibernate就不是一个太好的选择,选择 mybatis 就会加快许多,而且语句的管理也比较方便。 第二方面:开发工作量的对比 Hibernate和MyBatis都有相应的代码生成工具。可以生成简单基本的DAO层方法。针对高级查询,Mybatis需要手动编写SQL语句,以及ResultMap。而Hibernate有良好的映射机制,开发者无需关心SQL的生成与结果映射,可以更专注于业务流程。 第三方面:sql优化方面 Hibernate的查询会将表中的所有字段查询出来,这一点会有性能消耗。Hibernate也可以自己写SQL来指定需要查询的字段,但这样就破坏了Hibernate开发的简洁性。而Mybatis的SQL是手动编写的

MyBatis 源码分析-项目总览

筅森魡賤 提交于 2020-03-12 02:43:33
MyBatis 源码分析-项目总览 1.概述 本文主要大致介绍一下MyBatis的项目结构。 引用参考资料《MyBatis技术内幕》 此外, https://mybatis.org/mybatis-3/zh/index.html MyBatis官方也提供了很不错的中文文档。对于使用中有碰到一些问题,可以参考一下。 2.模块划分 MyBatis在项目模块划分还是很清晰的。各个模块层次以及具体作用,如下: 模块 层次 定义 session 接口层 提供给外部使用的接口API scripting 核心处理层 解析映射文件中的动态SQL节点。并形成数据库可执行的SQL语句。 mapping 核心处理层 映射 builder 核心处理层 配置解析 executor 核心处理层 执行器模块,串联整个执行流程。 plugin 核心处理层 插件模块:提供插件接口,通过自定义插件方式对MyBatis进行拓展 cursor 核心处理层 游标模块 reflection 基础支持层 反射模块:mybatis专门对反射模块进行封装。提供更加简单易用的API type 基础支持层 类型转换模块:Mybatis为简化配置提供了别名机制。提供java类型与JDBC类型转换 logging 基础支持层 日志模块:主要是集成第三方日志 io 基础支持层 资源加载模块:对类加载器进行了封装。确定类加载器顺序

Spring必备知识点(一)

你离开我真会死。 提交于 2020-03-10 23:48:38
Spring框架的7个模块 组成 Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下: 核心容器 : 核心容器提供 Spring框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用 控制反转 (IOC)模式将 应用程序的配置和依赖性规范 与 实际的应用程序代码 分开。 那么我们该如何理解:BeanFactory和FactoryBean 1、 BeanFactory BeanFactory定义了IOC容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是 Spring IOC 所遵守的最底层和最基本的编程规范。在Spring代码中,BeanFactory 只是个接口,并不是 IOC 容器的具体实现,但是 Spring 容器给出了很多种实现,如 DefaultListableBeanFactory 、 XmlBeanFactory 、 ApplicationContext 等,都是附加了某种功能的实现。 2、 FactoryBean 一般情况下,Spring通过反射机制利用<bean>的class属性指定实现类实例化Bean,在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,则需要在<bean>中提供大量的配置信息。配置方式的灵活性是受限的

(四)Mybatis 面试题

房东的猫 提交于 2020-03-10 13:52:51
Mybatis 86、Mybatis是什么? mybatis是一个持久层ORM框架。它内部封装了jdbc,使得开发更简洁,更高效。 Mybatis使开发者只需要关注sql语句本身,简化JDBC操作,不需要在关注加载驱动、创建连接、处理SQL语句等繁杂的过程。 MyBatis可以通过xml或注解完成ORM映射关系配置。 87、Mybatis和JDBC的关系? (标红) JDBC是Java提供的一个操作数据库的API; MyBatis是一个持久层ORM框架,底层是对JDBC的封装。 MyBatis对JDBC操作数据库做了一系列的优化: (1)mybatis使用已有的连接池管理,避免浪费资源,提高程序可靠性。 (2)mybatis提供插件自动生成DAO层代码,提高编码效率和准确性。 (3)mybatis 提供了一级和二级缓存,提高了程序性能。 (4)mybatis使用动态SQL语句,提高了SQL维护。(此优势是基于XML配置) (5)mybatis对数据库操作结果进行自动映射 88、什么是ORM?(标红) ORM的全称是Object Relational Mapping,即对象关系映射。 描述的是对象和表之间的映射。操作Java对象,通过映射关系,就可以自动操作数据库。 在ORM关系中,数据库表对应Java中的类,一条记录对应一个对象,一个属性对应一个列。 常见的ORM框架

linux系统进程的内存布局

别来无恙 提交于 2020-03-07 14:13:29
内存管理模块是操作系统的心脏;它对应用程序和系统管理非常重要。今后的几篇文章中,我将着眼于实际的内存问题,但也不避讳其中的技术内幕。由于不少概念是通用的,所以文中大部分例子取自32 位x86 平台的Linux 和Windows 系统。本系列第一篇文章讲述应用程序的内存布局。 在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中。这个沙盘就是虚拟地址空间(virtual address space ),在32 位模式下它总是一个4GB 的内存地址块。这些虚拟地址通过页表(page table )映射到物理内存,页表由操作系统维护并被处理器引用。每一个进程拥有一套属于它自己的页表,但是还有一个隐情。只要虚拟地址被使能,那么它就会作用于这台机器上运行的所有软件,包括内核本身。因此一部分虚拟地址必须保留给内核使用: 这并不意味着内核使用了那么多的物理内存,仅表示它可支配这么大的地址空间,可根据内核需要,将其映射到物理内存。内核空间在页表中拥有较高的特权级(ring 2 或以下),因此只要用户态的程序试图访问这些页,就会导致一个页错误(page fault )。在Linux 中,内核空间是持续存在的,并且在所有进程中都映射到同样的物理内存。内核代码和数据总是可寻址的,随时准备处理中断和系统调用。与此相反,用户模式地址空间的映射随进程切换的发生而不断变化:

Linux内存分配机制

不羁岁月 提交于 2020-03-07 14:07:34
原文:https://blog.csdn.net/gfgdsg/article/details/42709943 Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 基于以上认识,进行了如下分析: 一、Linux 虚拟地址空间如何分布? Linux 使用虚拟地址空间,大大增加了进程的寻址空间,由低地址到高地址分别为: 1、只读段:该部分空间只能读,不可写;(包括:代码段、rodata 段(C常量字符串和#define定义的常量) ) 2、数据段:保存全局变量、静态变量的空间; 3、堆 :就是平时所说的动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。 4、文件映射区域 :如动态库、共享内存等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间。 5、栈:用于维护函数调用的上下文空间,一般为 8M ,可通过 ulimit –s 查看。 6、内核虚拟空间

又能扯皮了!没内存了还能看片?

拥有回忆 提交于 2020-03-06 15:35:58
虚拟内存 尽管基址寄存器和变址寄存器用来创建地址空间的抽象,但是这有一个其他的问题需要解决: 管理软件的膨胀(managing bloatware) 。虽然内存的大小增长迅速,但是软件的大小增长的要比内存还要快。在 1980 年的时候,许多大学用一台 4 MB 的 VAX 计算机运行分时操作系统,供十几个用户同时运行。现在微软公司推荐的 64 位 Windows 8 系统至少需要 2 GB 内存,而许多多媒体的潮流则进一步推动了对内存的需求。 这一发展的结果是,需要运行的程序往往大到内存无法容纳,而且必然需要系统能够支持多个程序同时运行,即使内存可以满足其中单独一个程序的需求,但是从总体上来看内存仍然满足不了日益增长的软件的需求(感觉和xxx和xxx 的矛盾很相似)。而交换技术并不是一个很有效的方案,在一些中小应用程序尚可使用交换,如果应用程序过大,难道还要每次交换几 GB 的内存?这显然是不合适的,一个典型的 SATA 磁盘的峰值传输速度高达几百兆/秒,这意味着需要好几秒才能换出或者换入一个 1 GB 的程序。 SATA(Serial ATA)硬盘,又称串口硬盘,是未来 PC 机硬盘的趋势,已基本取代了传统的 PATA 硬盘。 那么还有没有一种有效的方式来应对呢?有,那就是使用 虚拟内存(virtual memory) ,虚拟内存的基本思想是,每个程序都有自己的地址空间