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

内存管理策略1

阅读更多
package com.prime.impl;

import java.nio.ByteBuffer;
import java.util.Comparator;
import java.util.TreeSet;

/**
 * <p>
 * 该内存管理对象主要是在当你需要长时间的new一快内存的时候使用,
 * <p>
 * <b>(主要作用是为了不让GC对这些内存不停的释放分配而消耗性能,而且每次获取的内存大小可以是自己指定的大小)</b>
 * <p>
 * 本内存管理对象主要通过预先分配一个大的ByteBuffer然后每次从这个ByteBuffer中获取一小块内存出来进行使用,
 * <p>
 * 具体获取内存的规则是在打的内存中获取一段连续的内存出来使用,如果中间有一小段内存(例如三个字节)未可以使用,
 * <p>
 * 但如果你获取的内存都币这三内存大的话,则永远获取不到该内存(这里就会产生一小块的内存碎片),
 * <p>
 * 当然只要该小段内存的前后被释放后将又可以获取使用
 * <p>
 * 主要是通过ByteBuffer的子序列来做到的,如果当预先分配的内存不足的时候,将重新分配另快大的内存
 * <p>
 * (该该重新分配的内存也是有初始化的时候用使用者设置,重新分配的内存将由本内存管理对象中的子内存管理对象所拥有,
 * <p>
 * 主要算法是通过链表的形式来实现,理论上当总内存不可用的时候可以无限分配新的内存) <br/>
 * 
 * @author 皮佳
 * 
 */
public class MomoryManagerByte implements MemoryObjInface {

	private static int defaultSize = 1024;
	/**
	 * Create size
	 */
	private static int byte_size = 1024 * 1024 * 1;

	private static int dilatancy_size = 1024 * 1024 * 1;

	/**
	 * 是否VM托管
	 */
	private static boolean isDirect = false;

	private ByteBuffer byteBuffer = null;

	private TreeSet<MomoryBuffer> bufferSet = new TreeSet<MomoryBuffer>(
			new MomoryBufferCommpositor());
	private MomoryManagerByte momoryManagerByte = null;

	public MomoryManagerByte() {
		this(byte_size, defaultSize, dilatancy_size, isDirect);
	}

	public MomoryManagerByte(boolean isDirect) {
		this(byte_size, defaultSize, dilatancy_size, isDirect);
	}

	public MomoryManagerByte(int byteSize) {
		this(byteSize, defaultSize, dilatancy_size, isDirect);
	}

	public MomoryManagerByte(int byteSize, boolean isDirect) {
		this(byteSize, defaultSize, dilatancy_size, isDirect);
	}

	public MomoryManagerByte(int byteSize, int defaultSize, int dilatancySize,
			boolean isDirect) {
		this.byte_size = byteSize;
		this.defaultSize = defaultSize;
		this.dilatancy_size = dilatancySize;
		this.isDirect = isDirect;

		if (this.isDirect) {
			byteBuffer = ByteBuffer.allocateDirect(this.byte_size);
		} else {
			byteBuffer = ByteBuffer.allocate(this.byte_size);
		}
	}

	@Override
	public ByteBuffer allocat() {
		return this.allocat(this.defaultSize);
	}

	@Override
	public ByteBuffer allocat(int size) {
	//先从总内存中获取
		ByteBuffer byteBuffer =gain(size);
		return null;
	}
	/**
	 * 从byteBuffer中获取一块内存出来使用
	 * @param size
	 * @return
	 */
	private ByteBuffer gain(int size) {
		boolean bor = false;
		//如果还没有获取过内存就直接从第一个位置开始获取
		if(bufferSet == null || bufferSet.size()<=0){
			this.byteBuffer.position(0);
			this.byteBuffer.limit(size);
			bor = true;
		}
		else{
			//如果之前获取过 
			synchronized (this.bufferSet) {
				//遍历之前获取的内存对象 拿到它的索引值 根据索引值来接着后面的位置获取
				Iterator<MomoryBuffer> iter =  bufferSet.iterator();
				int position = 0;
				while(iter.hasNext()){
					MomoryBuffer momoryBuffer = iter.next();
					if((momoryBuffer.getPosition() - position) >= size){
						this.byteBuffer.position(position);
						this.byteBuffer.limit(momoryBuffer.getPosition());
						bor = true;
						break;
					}
					position = momoryBuffer.getLimit();
				}
				if((this.byte_size - position) >= size){
					this.byteBuffer.position(position);
					this.byteBuffer.limit(position + size);
					bor = true;
				}
			}
		}
		ByteBuffer slicebuf = null;
		if(bor){
			slicebuf = this.byteBuffer.slice();
//			this.getBufferSet().add(new MomoryBuffer(slicebuf,slicebuf.arrayOffset(),slicebuf.arrayOffset() + slicebuf.limit()));
			this.getBufferSet().add(new MomoryBuffer(slicebuf,this.byteBuffer.position(),this.byteBuffer.limit()));
		}
		this.byteBuffer.clear();
		return slicebuf;
	}
	private ByteBuffer getByteBuffer() {
		return byteBuffer;
	}

	/**
	 * 返回正在使用的ByteBuffer队列,用来标示有哪些区间已经在使用了
	 * 
	 * @return
	 */
	private TreeSet<MomoryBuffer> getBufferSet() {
		return bufferSet;
	}
	@Override
	public void free(ByteBuffer buf) throws Exception {
		// TODO Auto-generated method stub

	}

	/**
	 * 用来封装去出来的内存,主要是为了表示该内存用到了总内存中的哪些区间
	 * 
	 * @author cloud _
	 */
	class MomoryBuffer {
		private ByteBuffer buf = null;
		private int position = 0;
		private int limit = 0;

		public MomoryBuffer(ByteBuffer _buf, int _position, int _limit) {
			this.buf = _buf;
			this.position = _position;
			this.limit = _limit;
		}

		public ByteBuffer getBuf() {
			return buf;
		}

		public int getPosition() {
			return position;
		}

		public int getLimit() {
			return limit;
		}
	}

	/**
	 * 一个排序器,用来将MomoryBuffer进行排序
	 * 
	 * @author cloud
	 * 
	 */
	class MomoryBufferCommpositor implements Comparator<MomoryBuffer> {

		public int compare(MomoryBuffer o1, MomoryBuffer o2) {
			int position_1 = o1.getPosition();
			int position_2 = o2.getPosition();

			if (position_1 > position_2) {
				return 1;
			}
			if (position_1 < position_2) {
				return -1;
			}
			return 0;
		}
	}
}
0
0
分享到:
评论

相关推荐

    深入理解Linux虚拟内存管理CD.rar

    四、内存管理策略 1. 伙伴系统:Linux用于分配和回收内存块的算法,确保内存分配效率。 2. SLAB分配器:优化小对象的内存分配,减少内存碎片。 3. 内存压力:当物理内存紧张时,内核会增加内存压力,触发更多的...

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

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

    内存管理资料

    内存管理是计算机科学中的核心概念,它涉及到操作系统如何...不同的内存管理策略和方法都有其适用场景,开发者应根据实际需求选择合适的方法。在实践中,良好的编程习惯和内存管理策略可以显著提升程序的性能和稳定性。

    (2008)内存管理算法介绍 Memory Management Algorithms.docx

    四、MemCached 的内存管理策略 1.多链表结构。 2.贪婪占有。 3.从不合并。 五、结论 内存管理算法的选择取决于系统的需求和限制。不同的算法都有其优缺,选择合适的算法可以提高系统的性能和效率。在实际...

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

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

    android低内存管理策略

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

    C语言实现内存管理

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

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

    1. 分页内存管理:分页是将内存划分为固定大小的块,称为页。每个进程都有自己的页表,用于记录页面在内存中的位置。vmalloc函数通常与内核空间的动态内存分配有关,可能涉及到虚拟地址到物理地址的转换,以及内存页...

    oracle内存全面分析

    二、内存管理策略 1. 自动内存管理 Oracle从10g版本开始引入自动内存管理,允许DBA通过设置SGA_TARGET和PGA_AGGREGATE_TARGET参数,让Oracle自动调整SGA和PGA的大小,简化内存管理。 2. Memory Advisor Oracle的...

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

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

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

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

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

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

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

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

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

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

    ecos系统内存管理

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

    Delphi快速内存管理 ScaleMM

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

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

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

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

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

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

    一些硬件平台支持内存保护单元(Memory Protection Units,MPUs)或者内存管理单元(Memory Management Units,MMUs),这为实现更为复杂和安全的内存管理策略提供了可能。 总结来说,嵌入式实时操作系统内存管理...

Global site tag (gtag.js) - Google Analytics