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;
}
}
}
分享到:
相关推荐
四、内存管理策略 1. 伙伴系统:Linux用于分配和回收内存块的算法,确保内存分配效率。 2. SLAB分配器:优化小对象的内存分配,减少内存碎片。 3. 内存压力:当物理内存紧张时,内核会增加内存压力,触发更多的...
这种动态内存管理策略的实施,是通过一系列的实验来验证的,实验结果表明了优化内存管理的有效性。 针对Android系统内存管理的研究不仅限于此。国外的Kosmach J等人对Android系统中的OpenCore多媒体框架进行了分析...
内存管理是计算机科学中的核心概念,它涉及到操作系统如何...不同的内存管理策略和方法都有其适用场景,开发者应根据实际需求选择合适的方法。在实践中,良好的编程习惯和内存管理策略可以显著提升程序的性能和稳定性。
四、MemCached 的内存管理策略 1.多链表结构。 2.贪婪占有。 3.从不合并。 五、结论 内存管理算法的选择取决于系统的需求和限制。不同的算法都有其优缺,选择合适的算法可以提高系统的性能和效率。在实际...
通过这样的模拟实现,开发者可以深入理解动态内存管理的工作原理,以及各种内存分配策略的优缺点。这对于编写高效、健壮的C语言程序以及理解操作系统内核的内存管理机制具有重要意义。此外,这个模拟器还可以作为一...
### Android低内存管理策略详解 #### 一、Android内存管理概览 Android操作系统以其高度定制化和优化的特性,尤其在资源有限的移动设备上表现出色。其内存管理机制是确保系统流畅运行的关键之一。不同于传统的...
通过合理的内存管理策略,如首次适应、最佳适应、最坏适应等,可以减少碎片。 6. **内存安全**: - **野指针**:未初始化或已释放的指针称为野指针,使用它们可能导致不可预测的行为。始终确保指针在使用前已正确...
1. 分页内存管理:分页是将内存划分为固定大小的块,称为页。每个进程都有自己的页表,用于记录页面在内存中的位置。vmalloc函数通常与内核空间的动态内存分配有关,可能涉及到虚拟地址到物理地址的转换,以及内存页...
二、内存管理策略 1. 自动内存管理 Oracle从10g版本开始引入自动内存管理,允许DBA通过设置SGA_TARGET和PGA_AGGREGATE_TARGET参数,让Oracle自动调整SGA和PGA的大小,简化内存管理。 2. Memory Advisor Oracle的...
本实验报告聚焦于在Red Hat 9环境下进行的内存管理实践,旨在深入理解内存分片、分配策略以及其对系统性能的影响。 首先,我们要知道内存管理的基本概念。在操作系统中,内存管理的主要任务包括内存分配、回收、...
6. **性能分析**:通过模拟不同的内存分配和释放场景,分析不同内存管理策略对碎片、效率和系统性能的影响。 通过这个实验,你可以深入了解内存管理的复杂性,提高编程技巧,并对操作系统的工作原理有更深入的理解...
在深入探讨Glibc内存管理的Ptmalloc源代码之前,我们先来了解一下内存管理的基本概念。内存管理是操作系统和编程语言库中的核心组件,它负责有效地分配和回收内存,以确保程序的高效运行和资源的有效利用。 2.1 X86...
实验的目的是通过实践加深对内存管理策略的理解。 实验的核心任务是实现可变分区内存管理系统,这涉及到以下几个关键步骤: 1. **内存分配**:内存分配的目的是将可用的内存空间分配给请求的进程。在这个实验中,...
通过这些数据,我们可以看到在不同的工作负载下,最先适应和最佳适应算法的优劣,为实际操作系统设计中的内存管理策略选择提供参考。 总的来说,这个模拟程序提供了一个直观的学习平台,帮助我们理解内存管理的基本...
### eCos系统的内存管理 #### 一、概述 eCos(Embedded Configurable Operating System)是一款专为嵌入式系统设计的可配置操作系统。其内存管理机制对于确保系统稳定性和提高性能至关重要。本文将深入探讨eCos...
《Delphi快速内存管理:揭秘ScaleMM》 在Delphi编程世界中,内存管理...通过理解并利用ScaleMM的特性,开发者可以构建更加高效、稳定的应用程序,同时,它的开源属性也为我们提供了深入学习和改进内存管理策略的机会。
这部分内容涉及内存管理的实践问题,以及在实际开发中遇到的内存泄露排查和解决策略。 文档还涉及了ptmalloc未初始化时分配/释放内存的处理,包括ptmalloc_init()函数的作用和行为,以及多个关于内存分配和释放的...
Linux和Windows 2000操作系统在内存管理方面有显著的区别,这主要体现在它们的内存模型、页面替换算法、虚拟内存以及内存分配策略等方面。以下是对这些知识点的详细阐述: 1. **内存模型** - **Linux内存模型**:...
一些硬件平台支持内存保护单元(Memory Protection Units,MPUs)或者内存管理单元(Memory Management Units,MMUs),这为实现更为复杂和安全的内存管理策略提供了可能。 总结来说,嵌入式实时操作系统内存管理...