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低内存管理策略
内存管理内幕 dragonimp's blog coder.developer.[designer].ArchitecturE.manager.^_^... posts - 29, comments - 121, trackbacks - 27 My Links Home Contact Login News !!! Article ...
.2 内存管理器 内存管理器的功能是管理物理内存,在我们的实验中,它是用来对(假想的) 物理内存进行管理的一组函数的集合。 内有函数能够返回一个范围在0和RAND_MAX之间的一个随机整数,该随 机量 服从均匀分布。
而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有 可变数据结构(比如可变数组) 的存在,也不允许有嵌套或者递归的结构出现,因为它们都 会导致编译程序无法计算准确的存储空间需求.
虚拟内存管理,基于时钟策略的页面置换
01-Linux内存管理之二:在X86上的虚拟内存管理.rar
模拟可变分区内存管理,比较几种不同的分配策略 。。。 释放空间:(1)释放单元前后都被占用,将其插入到当前hole结点后面。(2)仅前一单元为空,直接改变前一单元的size大小和释放单元的尾部,将其并入前一单元。...
内存管理机制是嵌入式系统研究中的一个重点和难点的问题,它必须满足以下几个特性: ①实时性。从实时性的角度出发,要求内存分配过程要尽可能地快。因此,在嵌入式系统中,不可能采用通用操作系统的一些复杂而完善...
Windows内存管理
Windows内存管理机制.doc
页面替换算法,内存管理优化策略,基于LRU,OPT, CLOCK等。
介绍了c++/C#的异常处理机制中,抛掷和捕获对象的构造和析构问题,分析在异常处理中内存资源的管理策略。
内容:“内存管理规则”总结了对象所有权和销毁的规则。“对象的所有权和销毁”描述了基本的对象所有权策略。“实用内存管理”以实用性的角度透视内存管理。“自动释放池”描述了自动释放池—一种延迟回收的机制—在...
深入剖析内存管理机制和策略,解析常见的内存问题调试方法
文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...
内存分配对齐策略 学习c/c++内存管理分配机制的同学们,这是一本必看的文档,你懂的
操作系统 内存管理 设计和实现关于内存管理的内存布局初始化及内存申请分配、内存回收等基本功能操作函数,尝试对用256MB的内存空间进行动态分区方式模拟管理。内存分配的基本单位为1KB,同时要求支持至少两种分配...
为了提高TTCN3测试组件间通信的性能,在基于TTCN3的基础测试平台上设计并实现了一套支持动态切换内存管理策略的共享内存管理框架,并在该框架下实现了三套不同的共享内存分配和自动回收策略。框架能够根据系统...
注:源码粘贴在报告中。原创,转载请注明。 本实验要求建造一个没有虚拟功能的...• 设计一个内存管理器,支持至少两种分配策略, 如first-fit, next-fit, best-fit, worst-fit 等。 • 对不同分配策略的性能进行评估。