`
cloud21
  • 浏览: 397589 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

内存管理策略2

阅读更多
package com.yz.net.impl;







import java.nio.ByteBuffer;

import java.util.HashMap;

import java.util.LinkedList;

import java.util.concurrent.atomic.AtomicBoolean;



/**

 * <p>该内存管理对象主要是在当你需要长时间的new一快内存的时候使用,

 * <p><b>(主要作用是为了不让GC对这些内存不停的释放分配而消耗性能)</b>

 * <p>与MomoryManagerByte的区别是在产生内存碎片的几率稍大一点,做法是当你获取一个指定的内存时 我们会到该大小对应的内存块队列中去找,

 * <P>如果没有在创建该内存块,并放进该内存快的队列当中,如果每次获取的内存大小不同则会每次都创建新的内存块队列。

 * <P> 注意该对象管理类 在初始化的时候不会预先分配,只有当需要使用的时候才会分配,并保留下来

 *

 * @author 皮佳

 *

 */

public class MemoryManagerLinked implements MemoryObjInface{

	

//	public static void main(String[] args) {

//		try{

//			MemoryManagerLinked memoryManagerLinked = new MemoryManagerLinked(1024,false);

//

//			ByteBuffer buf_1 = memoryManagerLinked.allocat(1);

//

//			ByteBuffer buf_2_1 = memoryManagerLinked.allocat(2);

//			ByteBuffer buf_2_2 = memoryManagerLinked.allocat(2);

//

//			ByteBuffer buf_3_1 = memoryManagerLinked.allocat(3);

//			ByteBuffer buf_3_2 = memoryManagerLinked.allocat(3);

//			ByteBuffer buf_3_3 = memoryManagerLinked.allocat(3);

//			ByteBuffer buf_3_4 = memoryManagerLinked.allocat(3);

//

//			memoryManagerLinked.free(buf_2_2);

//			memoryManagerLinked.free(buf_3_1);

//			memoryManagerLinked.free(buf_3_3);

//			

//			memoryManagerLinked.free(buf_3_3);

//

//		}catch (Exception e) {

//			e.printStackTrace();

//		}

//	}

	

	/** 是否在虚拟机所所管理的范围内创建内存 */

	private static  boolean isDirect;

	/** 默认货物的内存大小 */

	private static int defaultSize 		= 1024;	

	

	

	/** 总内存容器 key:字节大小 value:ByteBuffer队列 */

	public HashMap<Integer,LinkedList<BufferObj>> bufferObjMap = null;

	



	

	

	

	public MemoryManagerLinked(){

		this(defaultSize, isDirect);

	}

	

	public MemoryManagerLinked(int defaultSize){

		this(defaultSize, isDirect);

	}

	

	/**

	 * 构造

	 * @param isDirect		是否在虚拟机所所管理的范围内创建内存

	 */

	public MemoryManagerLinked(int defaultSize,boolean isDirect){ 

		this.defaultSize = defaultSize;

		this.isDirect = isDirect;

		

		bufferObjMap = new HashMap<Integer, LinkedList<BufferObj>>();

		

		

	}

	



	/**

	 * <p>获取默认的内存出来使用 在为调用free()方法时该内存区间将不可以再此被分配

	 * @return

	 */

	public ByteBuffer allocat(){

		return allocat(this.defaultSize);

	}

	

	/**

	 * <p>获取指定的内存出来使用  在为调用free()方法时该内存区间将不可以再此被分配

	 * @param size

	 * @return

	 */

	public ByteBuffer allocat(int size) {

		LinkedList<BufferObj> _linkedList = bufferObjMap.get(size);

		if(_linkedList == null){

			_linkedList = new LinkedList<BufferObj>();

			BufferObj _bufferObj = newBufferObj(size);

			_linkedList.add(_bufferObj);

			bufferObjMap.put(size, _linkedList);

			return _bufferObj.buf;

		}

		else{

			for(int i=0;i<_linkedList.size();i++){

				BufferObj bufferObj = _linkedList.get(i);

				if(bufferObj == null){

					continue;

				}

				//检查该内存是否在使用 

				if(bufferObj.atomicBoolean.get()){

					continue;

				}

				//标示为使用 并返回出去

				bufferObj.atomicBoolean.compareAndSet(false, true);

				return bufferObj.buf;

			}

			BufferObj _bufferObj = newBufferObj(size);

			_linkedList.add(_bufferObj);

			return _bufferObj.buf;

		}

	}

	

	

	/**

	 * 产生一个新的BufferObj

	 * @return

	 */

	private BufferObj newBufferObj(int size){

		BufferObj bufferObj = new BufferObj(size);

		bufferObj.atomicBoolean.compareAndSet(false, true);

		return bufferObj;

	}

	



	/**

	 * 归还buffer 如果该buf已经归还则抛出异常

	 * @param buf

	 */

	public void free(ByteBuffer buf) throws Exception {

		int size = buf.limit();

		LinkedList<BufferObj> _linkedList = bufferObjMap.get(size);

		if(_linkedList != null){

			for(int i=0;i<_linkedList.size();i++){

				BufferObj bufferObj = _linkedList.get(i);

				if(bufferObj == null){

					continue;

				}

				if(bufferObj.buf != buf){

					continue;

				}

				bufferObj.buf.clear();

				boolean b = bufferObj.atomicBoolean.compareAndSet(true, false);

				if(!b){

					throw new Exception(" 该内存已经被释放掉了 ");

				}

			}

		}

	}

	

	/**

	 * 用来封装分配出去的内存Buffer,主要作用是有一个原子的变量来标示为是正在使用

	 * @author Administrator

	 *

	 */

	class BufferObj {

		

		/** 标示该buffer已经被获取使用了,不能再被其它地方获取使用 */

		public AtomicBoolean atomicBoolean = new AtomicBoolean(false);

		

		public ByteBuffer buf = null;

		

		public BufferObj(int byteSize){

			if(MemoryManagerLinked.this.isDirect) {

				buf = ByteBuffer.allocateDirect(byteSize);

			}

			else {

				buf = ByteBuffer.allocate(byteSize);

			}

		}

	}

}






分享到:
评论

相关推荐

    面向Android系统的动态内存管理策略.pdf

    这种动态内存管理策略的实施,是通过一系列的实验来验证的,实验结果表明了优化内存管理的有效性。 针对Android系统内存管理的研究不仅限于此。国外的Kosmach J等人对Android系统中的OpenCore多媒体框架进行了分析...

    连续动态内存管理模拟实现

    通过这样的模拟实现,开发者可以深入理解动态内存管理的工作原理,以及各种内存分配策略的优缺点。这对于编写高效、健壮的C语言程序以及理解操作系统内核的内存管理机制具有重要意义。此外,这个模拟器还可以作为一...

    android低内存管理策略

    ### Android低内存管理策略详解 #### 一、Android内存管理概览 Android操作系统以其高度定制化和优化的特性,尤其在资源有限的移动设备上表现出色。其内存管理机制是确保系统流畅运行的关键之一。不同于传统的...

    操作系统 内存管理 实验3 2学时 114

    实验的目的是通过实践加深对内存管理策略的理解。 实验的核心任务是实现可变分区内存管理系统,这涉及到以下几个关键步骤: 1. **内存分配**:内存分配的目的是将可用的内存空间分配给请求的进程。在这个实验中,...

    C语言实现内存管理

    通过合理的内存管理策略,如首次适应、最佳适应、最坏适应等,可以减少碎片。 6. **内存安全**: - **野指针**:未初始化或已释放的指针称为野指针,使用它们可能导致不可预测的行为。始终确保指针在使用前已正确...

    内存管理源代码-内存管理源代码

    5. 内存分配策略:除了基本的分配和释放,内存管理还包括了缓存管理、内存池等高级策略,以提高内存的分配效率。例如,vmalloc可能使用了 slab 分配器,这是一种预分配内存块并按需分割的高效分配策略。 对于想要...

    操作系统内存管理实验报告

    本实验报告聚焦于在Red Hat 9环境下进行的内存管理实践,旨在深入理解内存分片、分配策略以及其对系统性能的影响。 首先,我们要知道内存管理的基本概念。在操作系统中,内存管理的主要任务包括内存分配、回收、...

    操作系统内存管理实验(C语言实现)

    6. **性能分析**:通过模拟不同的内存分配和释放场景,分析不同内存管理策略对碎片、效率和系统性能的影响。 通过这个实验,你可以深入了解内存管理的复杂性,提高编程技巧,并对操作系统的工作原理有更深入的理解...

    glibc内存管理ptmalloc源代码分析PDF

    这部分内容涉及内存管理的实践问题,以及在实际开发中遇到的内存泄露排查和解决策略。 文档还涉及了ptmalloc未初始化时分配/释放内存的处理,包括ptmalloc_init()函数的作用和行为,以及多个关于内存分配和释放的...

    glibc内存管理ptmalloc源代码分析@华庭1

    在深入探讨Glibc内存管理的Ptmalloc源代码之前,我们先来了解一下内存管理的基本概念。内存管理是操作系统和编程语言库中的核心组件,它负责有效地分配和回收内存,以确保程序的高效运行和资源的有效利用。 2.1 X86...

    内存管理-最先适应算法和最佳适应算法-模拟程序

    通过这些数据,我们可以看到在不同的工作负载下,最先适应和最佳适应算法的优劣,为实际操作系统设计中的内存管理策略选择提供参考。 总的来说,这个模拟程序提供了一个直观的学习平台,帮助我们理解内存管理的基本...

    Glibc内存管理Ptmalloc2源代码分析

    标题与描述中的关键词“Glibc内存管理Ptmalloc2...然而,如文章开头所述,对于内存释放后的行为不确定问题,可能源于内存管理器的缓存策略,需要开发者在设计内存管理策略时充分考虑,以避免潜在的资源浪费和性能瓶颈。

    Delphi快速内存管理 ScaleMM

    《Delphi快速内存管理:揭秘ScaleMM》 在Delphi编程世界中,内存管理...通过理解并利用ScaleMM的特性,开发者可以构建更加高效、稳定的应用程序,同时,它的开源属性也为我们提供了深入学习和改进内存管理策略的机会。

    ecos系统内存管理

    ### eCos系统的内存管理 #### 一、概述 eCos(Embedded Configurable Operating System)是一款专为嵌入式系统设计的可配置操作系统。其内存管理机制对于确保系统稳定性和提高性能至关重要。本文将深入探讨eCos...

    Linux内存管理 vs. Windows 2000内存管理

    Linux和Windows 2000操作系统在内存管理方面有显著的区别,这主要体现在它们的内存模型、页面替换算法、虚拟内存以及内存分配策略等方面。以下是对这些知识点的详细阐述: 1. **内存模型** - **Linux内存模型**:...

    嵌入式实时操作系统内存管理方法的研究.pdf

    伙伴系统是一种常用的内存管理策略,其核心思想是将内存分割成大小相同的块,并按照2的幂次方来组织。该方法能够快速分配和回收内存,同时减少了内存碎片。然而,伙伴系统通常不适合处理大小不一的内存分配请求,...

    操作系统--内存管理

    操作系统中的内存管理是计算机系统设计的关键部分,它涉及到如何有效地分配、使用和回收内存资源,以确保多个进程的高效运行和系统的稳定性。在这个实习作业中,我们将深入探讨内存管理的基本概念和技术。 首先,...

    深入比较Oracle与MySQL在内存管理上的策略与实践

    Oracle和MySQL作为两个主流的关系型数据库管理系统,在内存管理上采取了不同的策略和技术。本文将深入探讨Oracle与MySQL在内存管理方面的差异,包括内存架构、自动内存管理、手动内存管理,以及如何通过代码和配置来...

    lwip内存管理_单片机内存管理_

    lwip内存管理是嵌入式系统中非常关键的一部分,特别是在单片机环境下。LwIP(Lightweight IP)是一个开源的TCP/IP协议...在实际项目中,结合具体硬件条件和软件需求,灵活运用内存管理策略是提升单片机网络功能的关键。

Global site tag (gtag.js) - Google Analytics