C# 的内存管理类的问题

问题描述

为什麽C#内存管理类BufferManager可以无限制分配内存,不受最大内存大小的限制?直至内存耗光?代码如下:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.ServiceModel.Channels;usingSystem.Collections;namespaceBufferTest{classProgram{staticvoidMain(string[]args){BufferManagerbm=BufferManager.CreateBufferManager(128*1024*1024,16*1024*1024);ArrayListlist=newArrayList();Randomrd=newRandom();intj=0;for(inti=0;i<10000;i++){byte[]data=bm.TakeBuffer(16*1024*1024);if(data!=null){j++;Console.WriteLine("已成功分配的空间大小:"+j*16+"M");rd.NextBytes(data);}list.Add(data);}//防止自动回收ConsoleKeyInfok=Console.ReadKey();if(k.KeyChar=='y'){list.Clear();}else{Console.Write(list[rd.Next()].ToString());}}}}

解决方案

解决方案二:
BufferManager.CreateBufferManager这个应是你每次提取的内存数的最大值,与最小值吧,而不是他的总量。
解决方案三:
楼主的意思是:BufferManager可以分配的内存大小超过计算机物理内存大小?

时间: 2024-11-03 21:36:27

C# 的内存管理类的问题的相关文章

c++ 动态内存管理类 静态成员

问题描述 c++ 动态内存管理类 静态成员 C++primer 5th private 中 alloc 是static吗?是的话默认构造函数应该初始化没了,应该还要定义. 解决方案 动态内存管理类 解决方案二: 有static才是静态的.但它allocator的实现可能达到了静态的效果.

高质量C++/C编程指南-第7章-内存管理(4)

7.5 free和delete把指针怎么啦?7.7 杜绝"野指针""野指针"不是NULL指针,是指向"垃圾"内存的指针.人们一般不会错用NULL指针,因为用if语句很容易判断.但是"野指针"是很危险的,if语句对它不起作用. "野指针"的成因主要有两种: (1)指针变量没有被初始化.任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气.所以,指针变量在创建的同时应当被初始化,要么

Flink内存管理源码解读之内存管理器

回顾 上一篇文章我们谈了Flink自主内存管理的一些基础的数据结构.那篇中主要讲了数据结构的定义,这篇我们来看看那些数据结构的使用,以及内存的管理设计. 概述 这篇文章我们主要探讨Flink的内存管理类MemoryManager涉及到对内存的分配.回收,以及针对预分配内存而提供的memory segment pool.还有支持跨越多个memory segment数据访问的page view. 本文探讨的类主要位于pageckage : org.apache.flink.runtime.memor

Open Cascade中的内存管理

Open Cascade中的内存管理 Memory Management in Open Cascade eryar@163.com 一.C++中的内存管理 Memory Management in C++ 1. 引言 为了表现出多态,在C++中就会用到大量的指针和引用.指针所指的对象是从内存空间中借来的,当然要及时归还.特别是指针在程序中随心所欲地创建,因此,一个指针究竟指向哪个对象,一个对象到底被几个指针所指向,是程序员十分关注的事情. C++中涉及到的内存管理问题可以归结为两方面:正确地掌

WINX窗口类对象的内存管理

为了引入WINX窗口类对象的内存管理(生命周期模型),我绕了一大圈子.实在是,内存 管理太重要了,花多少口舌介绍它都不过分.我曾经见到这样一句话:"C++程序员觉得 内存管理太重要了,所以一定要自己进行管理:Java/C#程序员觉得内存管理太重要了,所以 一定不能自己去管理".从某种意义上说,两者都是对的. 那么WINX的窗口对象是否也是采用gc allocator呢? 答:不是. 具体问题具体分析.在通常情况下,我个人确实已经非常习惯使用gc allocator来进行内 存管理,但是

从JVM内存管理的角度谈谈JAVA类的静态方法和静态属性

在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的内存分为两部分:Stack和Heap.(stack和heap都是位于RAM中的) stack(栈)是JVM的内存指令区.stack管理很简单,push一定长度字节的数据或者指令,stack指针压栈相应的字节位移:pop一定字节长度数据或者指令,stack指针弹栈.stack的速度很快,管理很简单,并

聊聊内存管理

这篇文章我们聊聊内存管理. 本来我想不针对于任何具体的操作系统来谈内存管理,但是又觉得不接地气.言之无物.所以我决定在阐述概念的同时,还针对IA32平台Linux下的内存管理做简要的介绍,并且以实验来证明结论.以下内容分拆为几个大标题和小节,内容前后承接. 物理地址空间 首先,什么是物理地址空间?我们知道CPU与外部进行信息传递的公用通道就是总线,一般而言,CPU有三大总线:控制总线.数据总线.地址总线.这三类总线在一定程度上决定了CPU对外部设备的控制和数据传送能力.其中地址总线决定了CPU能

c#内存管理.

尽管在.net framework中我们不太需要关注内存管理和垃圾回收这方面的问题,但是出于提高我们应用程序性能的目的,在我们的脑子里还是需要有这方面的意识.明白内存管理的基本行为将有助于我们解释我们程序中变量是如何操作的.在本文中我将讨论栈和堆的一些基本知识,变量的类型和某些变量的工作原理. 当你在执行程序的时候内存中有两个地方用于存储程序变量.如果你还不知道,那么就来看看堆和栈的概念.堆和栈都是用于帮助我们程序运行的,包含某些特殊信息的操作系统内存模块.那么堆和栈有什么不同呢? 堆VS栈的区

iOS开发系列—Objective-C之内存管理

概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 引用计数器 属性参数 自动释放池 引用计数器 在Xcode4.2及之后的版本中