内存管理

Android,谁动了我的内存(1)

不打扰是莪最后的温柔 提交于 2019-11-26 21:12:38
一、 Android的内存机制 Android的程序由Java语言编写,所以Android的内存管理与Java的内存管理相似。程序员通过new为对象分配内存,所有对象在java堆内分配空间;然而对象的释放是由垃圾回收器来完成的。C/C++中的内存机制是“谁污染,谁治理”,java的就比较人性化了,给我们请了一个专门的清洁工(GC)。 那么GC怎么能够确认某一个对象是不是已经被废弃了呢?Java采用了有向图的原理。Java将引用关系考虑为图的有向边,有向边从引用者指向引用对象。线程对象可以作为有向图的起始顶点,该图就是从起始顶点开始的一棵树,根顶点可以到达的对象都是有效对象,GC不会回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。 二、Android的内存溢出 Android的内存溢出是如何发生的? Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M。因此我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现OutOfMemory的错误。 为什么会出现内存不够用的情况呢?我想原因主要有两个: 由于我们程序的失误,长期保持某些资源(如Context)的引用,造成内存泄露,资源造成得不到释放。 保存了多个耗用内存过大的对象

Hadoop集群管理之内存管理

回眸只為那壹抹淺笑 提交于 2019-11-26 20:31:56
1、内存 Hadoop为各个守护进程(namenode,secondarynamenode,jobtracker,datanode,tasktracker)统一分配的内存在hadoop-env.sh中设置,参数为HADOOP_HEAPSIZE,默认为1000M。 大部分情况下,这个统一设置的值可能并不适合。例如对于namenode节点,1000M的内存只能存储几百万个文件的数据块的引用。如果我想单独设置namenode的村粗,可以通过HADOOP_NAMENODE_OPTS来设置。 同样的,可以通过HADOOP_SECONDARYNAMENODE_OPTS来设置secondarynamenode的内存,使得它与namenode保持一致。 当然,还有HADOOP_DATANODE_OPTS、HADOOP_ BALANCER_OPTS、HADOOP_JOBTRACKER_OPTS变量供你使用。 此外,tasktracker启动独立的子JAM以运行map和reduce任务,分配给每个子JVM的内存量由mapred.child.java.opts属性(mapred-site.xml)控制,默认值为200M。 2、最大map任务数 一个tasktracker能够同时运行最大map任务数,由mapred.tasktracker.map.tasks.maximum属性(mapred-site

SGI STL内存管理

随声附和 提交于 2019-11-26 20:17:18
SGI STL内存管理 在SGI STL版本的内存管理中,使用这样一种方式来分配内存: 内存分配+对象初始化 。首先是分配内存,其次是根据对象的类型(是否为POD【Plain of Data】)来使用最有效的方式来初始化对象。回收内存也是用同样的方式: 析构对象+回收内存 ,根据对象是否为POD类型,确定最有效的析构方式。 SGI STL使用双层级配置器,第一级配置器直接使用 malloc()和free() ,第二级根据如下策略:当配置区块>128 Bytes时,视之为“足够大”,调用一级配置器,否则视之为过小,调用二级配置器。 一级配置器:__malloc_alloc_template template <int __inst> //非型别参数,没排上用处 class __malloc_alloc_template { private: static void* _S_oom_malloc(size_t); //用来处理内存不足的情况,out of memory static void* _S_oom_realloc(void*, size_t); static void (* __malloc_alloc_oom_handler)(); public: static void* allocate(size_t __n) //分配内存 { void* __result =

Linux_内存、虚拟内存

感情迁移 提交于 2019-11-26 19:56:43
内存的管理方案: 分区:固定分区: 操作系统启动时将内存分配完成 大小相等的固定分区: 将内存分配成大小相等的区块,会产生内部碎片 放置策略:为每一个区块维护一给队列,为整体维护一个等待队列 大小不等的固定分区: 将内存分配成大小不等的区块,会产生内部碎片 放置策略:将程序放到能够容纳的最小分区,放到当前能够容纳的最小空闲分区 动态分区: 进程执行时,才会动态分配内存,会产生外部碎片, 动态分区的三种方式 首次适配:按分区在内存的先后次序,从上次分配的分区起找到合适的第一个 临近适配: 从上一次放置的地方开始扫描,找下一个合适的空闲分区 最佳适配:按分区在内存的次序从头查找,找到相差最小的空闲分区 分页: 在大小相等的固定分区上的扩展,操作系统会为每一个进程维护一个页表,一个进程可以占有多个页帧,同一个进程的加载空间可以不连续 分段: 动态分区上的扩展,操作系统为每一个进程维护一个段表,一个进程可以占有多个段表,同一个进程的所有段可以不连续,段号、基地址、段大小 伙伴系统: 分配内存时,如果可用的内存空间较大,则将其一分为二,直到分配的空间不能再次分割(再分割会小于申请空间),就将其中一个分配给申请的进程 虚拟内存技术: 交换分区: 放置策略: 为每一个区块维护一个等待队列 整体维护一个等待队列 进程的4G虚拟地址空间布局 来源: https://blog.csdn.net/Duc

谈谈 C++ 内存管理

对着背影说爱祢 提交于 2019-11-26 17:38:49
有多少个new就有多少个delete 二维动态数组的写法 首先开辟第一维的空间,第一维是char型的指针 char **s = new char *[ 182 ]; 在第一维的基础上,开辟第二维的空间,第二维是不定长度的char型 s[nCounts] = new char [str.length()]; 释放二维动态数组时,规则是由内到外的,先释放第二维的空间,最后再释放第一维的空间 for ( int i = 0 ; i < nCounts; ++ i) { delete[] s[i]; // delete[col] s[i]; s[i] = NULL; } delete[] s; // delete[row] s; s = NULL; s是二维指针,(声明)定义在main函数内,既然定义时在函数内,那么s指针就存放在内存中的栈区域中,使用new动态开辟的空间是在堆区域,堆区域用于存放数据,当然,每个数据都有它的内存地址,因此数据的地址是堆中的某一块地址,而栈中的s只是一个指针,这个指针指向堆区域的指定一块地址,当使用delete释放第二维的空间时,实质是回收堆上的虚拟地址块,而栈内的指针s并无发生变化 实现代码: 1 /// : handleString 2 #include <cstdlib> 3 #include < string > 4 #include <vector

Android 之 内存管理

妖精的绣舞 提交于 2019-11-26 15:58:23
概述 在 android 的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个 dalvik 虚拟机分配的内存是有限的,在 google 的 G1 中,分配的最大堆大小只有 16M ,后来的机器一般都为 24M ,实在是少的可怜。这样就需要我们在开发过程中要时刻注意。不要因为自己的代码问题而造成 OOM 错误。 JAVA 的内存管理 大家都知道, android 应用层是由 java 开发的, android 的 davlik 虚拟机与 jvm 也类似,只不过它是基于寄存器的。因此要了解 android 的内存管理就必须得了解 java 的内存分配和垃圾回收机制。 在 java 中,是通过 new 关键字来为对象分配内存的,而内存的释放是由垃圾收集器( GC )来回收的,工程师在开发的过程中,不需要显式的去管理内存。但是这样有可能在不知不觉中就会浪费了很多内存,最终导致 java 虚拟机花费很多时间去进行垃圾回收,更严重的是造成 JVM 的 OOM 。因此, java 工程师还是有必要了解 JAVA 的内存分配和垃圾回收机制。 内存结构 上面这张图是 JVM 的结构图,它主要四个部分组成: Class Loader 子系统和执行引擎,运行时方法区和本地方法区,我们主要来看下 RUNTIME DATA AREA区,也就是我们常说的JVM内存。从图中可以看出, RUNTIME

JVM内存管理

倾然丶 夕夏残阳落幕 提交于 2019-11-26 15:44:15
前几天公司的郑大晔校上,XXX同事做了JVM的Session,于是趁端午节放假的功夫,研究了一些JVM相关的知识。 在Java生态系统中,JVM占据至关重要的作用,就像一个适配器,它向编程语言(主要是Java)屏蔽了操作系统的差异,所以实现了“一次编写,到处运行”的理想;同时也向操作系统屏蔽了编程语言之间的差异,能让Java、Clojure、JRuby、JPython、Groovy等高级语言运行于Java虚拟机之上;可以说,JVM完全实现了跨系统跨语言的支持。 如果以 Jeffery Richter 的眼光看来,JVM在某种程度上,也应该算作是它自己的操作系统,因为它有自己的内存管理器、自己的安全系统、自己的文件加载器,自己的错误处理机制、自己的线程处理模型;总之一句话,JVM是相当的牛B。 (跑题一下,正所谓“理想很丰满、现实很骨干”,iOS上根本无法运行JVM,原因很简单,苹果公司禁止在iOS中使用及时编译;这也是为什么Mono在开发完成后也只得将源代码直接编译为Native Code;可能很多人会说,我们不能用边解释边执行的方式在iOS上运行Java程序么?至于这个问题,下面再谈......归根结底,“一次编写,到处运行”有时候并不是你想像的那样牛X)。 言归正传,自Java诞生以来,历史上曾产生过很多优秀的虚拟机,最出名的要数Sun公司的Classic VM和HotSpot

009 Java-内存管理

蹲街弑〆低调 提交于 2019-11-26 14:10:37
对象内存管理 编译好的Java程序要运行在JVM中 程序,无论是代码还是数据,都要存储在内存中,JVM为Java程序提供并管理所需要的内存空间 JVM在其内存开辟了"堆"、“栈”、"方法区"三个区域,分别存储不同的数据; 垃圾回收机制 垃圾回收器(GC)是JVM自带的一个线程(自动运行着的程序),用于回收没有任何引用指向的对象; Java程序员不用担心内存管理,因为GC会自动进行回收管理; GC的回收对程序员来说是透明的,并不一定一发现有无引用的对象,就立刻回收; System.gc():用于建议虚拟机马上调度GC线程回收资源,具体的实现策略取决于不同的JVM系统; 堆内存 这部分空间用于存储使用new关键字所创建的对象,成员变量是对象的属性,也在堆中; 对象的声明周期:创建对象时存在堆中,对象被GC回收时消失; 内存泄漏:不再使用的对象没有被及时的回收; 建议:当对象不在使用时应及时将引用设置为null; 非堆–栈 这部分空间用于存储程序运行时(正在调用中的)在方法中声明的所有局部变量; 调用方法时JVM在栈中为该方法分配一个对应的空间,也称为栈帧,栈帧中包含所有的局部变量(包括参数); 当方法调用结束时,栈帧消失; 局部变量的生命周期:调用方法时存在栈中,方法调用结束时与栈帧一并消失; 非堆–方法区 这部分空间用于存放类的信息(包括方法); Java程序运行时

告诉你,虚拟内存多大合适

安稳与你 提交于 2019-11-26 11:27:54
在设置“虚拟内存”的大小时,我们都想知道系统到底需要多少内存才会够呢?因为“虚拟内存”的值设置得太大,会浪费硬盘空间;如果设置得太小,又会弹出警报信息,导致应用程序异常中止,甚至会导致系统死锁。最简单的方法是使用“任务管理器”来查看当前内存的使用情况。   先将我们常用的应用程序都打开,包括网络浏览器、输入法等,然后同时按住“Ctrl”、“Alt”和“Del”三个键,就可以调出“Windows任务管理器”窗口,然后,再选择“性能”,即可查看内存的使用情况。   我们主要查看“物理内存”和“认可用量”的使用情况。笔者的系统的物理内存为256M,虚拟内存的大小为300M,我的“物理内存”的“可用数”为70880K,应该没问题的;在“认可用量”中,我的“总数”为251408K,“峰值”达到274880K,这个数值离我设置的“虚拟内存”的大小很接近,如需要安装其它的消耗内存较多的软件,则需要增加“虚拟内存”的值。   虚拟内存使用技巧   不要将虚拟内存设置在系统分区中;   将虚拟内存设置在另一块高速磁盘中;   将虚拟内存设置在使用NTFS文件格式的分区中;   将最大值和初始大小设置为一个相同的值;   将初始大小设置为物理内存的1.5倍;   不要在同一块硬盘中设置“分页文件”。 转载于:https://www.cnblogs.com/dyc988/archive/2009/12

虚拟内存让系统更流畅

一曲冷凌霜 提交于 2019-11-26 11:27:36
1、虚拟内存的作用 广告:d_text   内存在计算机中的作用很大,电脑中所有运行的程序都需要经过内存来执行,如果执行的程序很大或很多,就会导致内存消耗殆尽。为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张。举一个例子来说,如果电脑只有128MB物理内存的话,当读取一个容量为200MB的文件时,就必须要用到比较大的虚拟内存,文件被内存读取之后就会先储存到虚拟内存,等待内存把文件全部储存到虚拟内存之后,跟着就会把虚拟内里储存的文件释放到原来的安装目录里了。下面,就让我们一起来看看如何对虚拟内存进行设置吧。    2、虚拟内存的设置   对于虚拟内存主要设置两点,即内存大小和分页位置,内存大小就是设置虚拟内存最小为多少和最大为多少;而分页位置则是设置虚拟内存应使用那个分区中的硬盘空间。对于内存大小的设置,如何得到最小值和最大值呢?你可以通过下面的方法获得:选择“开始→程序→附件→系统工具→系统监视器”(如果系统工具中没有,可以通过“添加/删除程序”中的Windows安装程序进行安装)打开系统监视器,然后选择“编辑→添加项目”,在“类型”项中选择“内存管理程序”,在右侧的列表选择“交换文件大小”。这样随着你的操作,会显示出交换文件值的波动情况,你可以把经常要使用到的程序打开