内存碎片

深入理解C语言内存管理

北慕城南 提交于 2019-12-27 02:10:21
之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少。 问题不能拖,我这就来学习一下吧,争取一次搞定。 在任何程序设计环境及语言中,内存管理都十分重要。 内存管理的基本概念 分析C语言内存的分布先从Linux下可执行的C程序入手。现在有一个简单的C源程序hello.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 int var1 = 1; 4 5 int main(void) { 6 int var2 = 2; 7 printf("hello, world!\n"); 8 exit(0); 9 } 经过gcc hello.c进行编译之后得到了名为a.out的可执行文件 [tuhooo@localhost leet_code]$ ls -al a.out -rwxrwxr-x. 1 tuhooo tuhooo 8592 Jul 22 20:40 a.out ls命令是查看文件的元数据信息 [tuhooo@localhost leet_code]$ file a.out a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs),

架构师-JVM(一)

两盒软妹~` 提交于 2019-12-26 23:41:33
参考资料: 官网 《深入理解Java虚拟机:JVM高级特性与最佳实践》 葛一鸣老师的《实战Java虚拟机》 一.类加载机制 编译过程:从源码到.class文件, javac Person.java --> Person.class Person.java -> 词法分析器-> tokens流 ->语法分析器->语法树/抽象语法树->语义分析器->注解抽象语法树->字节码生成器-> Person.class 文件 类文件(Class文件)格式: 官网定义 The class File formt JVM为什么可以做到跨平台,统一的class文件格式,详细可以参考官网文档 JVM想运行java程序,首先一步是先要将编译过得类文件加载到JVM内,想了解JVM,首先需要了解类加载机制上图表示类文件(class)到虚拟机的过程(类加载机制) 1 类加载机制过程 1.1 装载(Load) 查找和导入class文件 ( 1 ) 通过一个类的全限定名 ( 包名 + 类名 ) 获取定义此类的二机制字节流 ( 2 ) 将这个字节流所代表的静态存储结构转化为方法区的运行时数据机构 ( 3 ) 在 JAVA 堆中生成一个代表这个类的java . lang . class 对象,作为对方法区中这些数据的访问入口 对于类的二机制流,JVM可以通过多种途径产生或获得,如: (1)

操作系统知识系列之基础篇

為{幸葍}努か 提交于 2019-12-26 08:34:34
一、操作系统概述 特性 1. 并发: 同一时间间隔内支持执行多个任务, 对于一个核则是交替执行; 2. 共享: 硬件资源或数据资源支持多个进程共享; 3. 异步: 并发情况下, 一个程序会陆陆续续被执行,完成时间不可预知; 4. 虚拟: 物理实体转化为逻辑实体,如虚拟内存。 基本功能 CPU管理:对处理器的管理和调度最终归结为对进程和线程的管理和调度,包括进程控制和管理,线程控制和管理,确定处理器调度策略,设计处理器调度算法,做好处理器分配和回收。 存储管理:存储管理的主要任务是管理内存资源,为多道程序运行提供有力支撑,提高存储空间利用率,具体来说有内存分配与回收,地址转换与存储保护,内存共享与存储扩充等。 设备管理:设备管理的除妖任务是管理各种外部设备,完成用户提出的I/O请求;加快数据传输速度,发挥设备的并行性,提高设备的利用率;提供设备驱动程序和中断处理请求。 文件管理:文件库案例的主要任务有提供文件逻辑组织方法,提供文件物理组织方法,提供文件存取和使用方法,实现文件目录管理,实现文件共享和安全性控制,实现文件存储空间管理等。 体系结构 大内核:将操作系统作为一个整体放在内核当中。 微内核:将操作系统的功能进行详细划分,只有微内核在内核态中存在,其他的在用户态。由于存在用户态和内核态的切换所以会影响系统整体性能。 补充 用户栈: 进程在用户空间时创建的栈

mysql 监控及优化——转载自http://www.cnblogs.com/suansuan/

孤者浪人 提交于 2019-12-26 08:14:43
1、Mysql连接数   Mysql默认最大连接数为100。   设置Mysql的最大连接数,在Mysql的配置文件中增加:   max_connections = 1000               #Mysql的最大连接数,默认如果不写的话是100个   wait_timeout = 10               #超时时间   配置文件路径:    (/etc/my.cnf 系统自带) (/opt/lampp/etc/my.cnf 安装Mysql 路径)   查看当前有多少个连接   show status like '%Threads_connected%';  #查看当前连接数   show processlist;            #也可查看锁表 2、Mysql缓存   Query Cache缓存的是sql语句对应的结果集,InnoDB_Buffer_Pool中缓存的是表中的数据。Buffer_Pool是设置的越大越好,一般设置为服务器物理内存的70%。   缓存1(MySQL层):查询缓存 Query Cache     ①.查询表里的数据有变化,之前的缓存失效。     ②.查询语句必须一模一样,才能用查询缓存;只要字符大小写或者注释等有一点点不同,都不可以用查询缓存。     ③.任何一个包含不确定的函数(比如now(),current_date()

redis参数与持久化原理

本秂侑毒 提交于 2019-12-25 17:07:21
[root@JR hx]# redis-cli info # Server redis_version:2.8.19 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:3f46a0c12d2b66a6 redis_mode:standalone 模式:是否做主从同步了 os:Linux 2.6.32-431.23.3.el6.x86_64 x86_64 #linux 版本 arch_bits:64 # 架构 multiplexing_api:epoll gcc_version:4.4.7 process_id:20848 run_id:c77b9becd5a017913d778ac23ad7ea2032741b2d tcp_port:6379 uptime_in_seconds:18308503 自 Redis 服务器启动以来,经过的秒数 uptime_in_days:211 自 Redis 服务器启动以来,经过的天数 hz:10 lru_clock:3570345 以分钟为单位进行自增的时钟,用于 LRU 管理 config_file: # Clients connected_clients:47 已连接客户端的数量(不包括通过从属服务器连接的客户端) client_longest_output_list:0

分配内存时如何减少内存碎片

那年仲夏 提交于 2019-12-25 13:16:48
  感觉面试的时候经常会被问到这个问题,然后我也学习了一下Memcached的slab机制,发现很多服务器都是使用这种机制来分配内存,所以决定学习一下。   首先,先对内存分配中的伙伴系统有初步的了解:   在编程和使用的服务器软件中,经常需要分配一组连续的页框,而频繁地申请和释放不同大小的连续页框,必然导致在已分配页框的内存块中分散了许多小块的空闲页框。这样,即使这些页框是空闲的,但要分配一个大块的连续页框就可能无法满足。   而Linux采用了伙伴系统来解决上述难题。把所有的空闲页框分组为11个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256,512和1024个连续页框的页框块。最大可以申请1024个连续页框,对应4MB大小的连续内存。每个页框块的第一个页框的物理地址是该块大小的整数倍。例如,大小为16个页框的块,其起始地址是16×212的倍数。 假设要申请一个256个页框的块,先从256个页框的链表中查找空闲块,如果没有,就去512个页框的链表中找,找到了则将页框块分为2个256个页框的块,一个分配给应用,另外一个移到256个页框的链表中。如果512个页框的链表中仍没有空闲块,继续向1024个页框的链表查找,如果仍然没有,则返回错误。 页框块在释放时,内核会主动将两个互为伙伴的页框块合并为一个较大的页框块

C++内存池技术分析

杀马特。学长 韩版系。学妹 提交于 2019-12-25 04:45:42
文章目录 C++内存池技术分析 1. new 和 delete 1.1 内存分配的原理 1.2 new 和 delete重载 1.3 定位new 1.4 应用 1.5 内存池 2. allocator 2.1 allocator 基本操作 2.2 实例 2.3 allocator的实现 2.3.1 allocate内存分配 2.3.2 construct内存构造 2.3.3 destroy内存析构 3. 总结 C++内存池技术分析 为了防止应用程序频繁的使用分配和释放内存,很多程序都会使用内存池技术来预先分配内存,使用内存的时候再从内存池中取出内存。 内存池的好处是优化内存分配,使得内存碎片减少,不过使用起来肯定会增加复杂程度。在C++中有两种办法来提供内存池管理方案: new 和 delete 。 std::allocator 。 通过这两种方式,我们可以手动管理内存。 1. new 和 delete 1.1 内存分配的原理 在C++中new和delete不是一个函数,而是一个操作表达式,我们使用的时候如下: class CData { public : CData ( int d ) : Data ( d ) { } private : int Data ; } ; void Mem ( ) { CData * data = new CData ( 100 ) ; }

吃透了这些JVM核心知识点,阿里架构师都问不倒你!(附学习笔记+面试真题+视频解析)

自闭症网瘾萝莉.ら 提交于 2019-12-25 00:13:53
作为 Java 的从业者,在找工作的时候,一定会被问及关于 JVM 相关的知识。 JVM 知识的掌握程度,在很多面试官眼里是候选人技术深度的一个重要评判标准。而大多数人可能没有对 JVM 的实际开发和使用经验,接下来这一系列文章将带你深入了解 JVM 需要掌握的各个知识点。这也将帮助你完成从初级程序员到高级程序员的转变。 今天分享一份平时学习的Java程序员必备的JVM学习文档,这份文档不管是懂得JVM的开发者和刚刚学习的朋友都是一份非常不错的内容,同时也是面试复习的精选文档!还准备了一份目前互联网公司Java面试的高频面试知识点文档免费分享给大家! 这份JVM知识整理文档内容包括: JVM面试专题 JVM和性能优化学习思维笔记(Xmind) 深入理解Java虚拟机 Java虚拟机并发编程 Java虚拟机:JVM高级特性与最佳实践 JVM性能调优-JVM内存整理及GC回收 实战Java虚拟机 快速获取资源传送门: 史上最详细面试学习核心笔记免费获取:Java基础+算法+JVM+数据库+SSM框架+Redis+消息队列+Spring全家桶等 内存模型以及分区,需要详细到每个区放什么。 JVM 分为堆区和栈区,还有方法区,初始化的对象放在堆里面,引用放在栈里面, class 类信息常量池(static 常量和 static 变量)等放在方法区 new: 方法区:主要是存储类信息,常量池

JVM内存区域与垃圾回收

谁说胖子不能爱 提交于 2019-12-24 23:58:40
1、JAVA内存区域与内存溢出 1.1、概述 Java中JVM提供了内存管理机制,Java虚拟机在执行Java程序的过程中会把内分分为不同的数据区,如图: 1.2、程序计数器 程序计数器是当前线程所执行的字节码的行号指示器,作用就是根据计数器的值获取下一条要执行的字节码指令。当执行的是java方法,则记录的是正在执行的虚拟机字节码指令的地址,如果是Native方法,则这个计数器的值为空。不存在任务OutOfMemoryError。 1.3、虚拟机栈 每个普通Java方法(除去Native方法)在执行的时候都会同时创建栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息,每个方法被调用直到完成的过程对应着栈帧在JVM栈中的入栈与出栈。其中局部变量表所需要的内存空间在编译器间完成分配。 跟虚拟机栈相关联的异常有两种: StackOverflowError 线程请求的栈深度大于虚拟机允许的最大深度。 OutOfMemoryError 虚拟机栈扩展时无法申请到足够的内存。 1.4、本地方法栈 用于虚拟机执行Native方法,其他和本地方法栈相同。也会有StackOverflowError和OutOfMemoryError。 1.5、堆 虚拟机启动后创建堆,用于存放对象实例。堆时垃圾回收器的主要工作区域,主要分为新生代和老年代,新生代又可以细分为Eden空间、From

Redis配置与优化

这一生的挚爱 提交于 2019-12-24 20:49:18
Redis配置与优化 Redis概述 Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 Redis优点 具有极高的数据读写速 支持丰富的数据类型 支持数据的持久化 原子性 支持数据备份 Redis配置文件(/etc/redis/6379.conf)bind: 监听的主机地址 port: 端口 daemonize yes: 启用守护进程 pidfile: 指定PID文件 loglevel notice: 日志级别 logfile: 指定日志文件 Redis安装部署 #安装编译环境 [ root@localhost ~ ] # yum install gcc gcc-c++ make -y #远程挂载源码包 [ root@localhost ~ ] # mount.cifs //192.168.142.1/redis /mnt Password for root@//192.168.142.1/redis: #解压源码包 [ root@localhost ~ ] # cd /mnt [ root