java动态内存分部,如何利用Java实现动态内存分配?

一.实验原理

原理:内存以分区为单位,每个分区可由(ID,addr,size,)进行描述

class sector{

int id = -1;//记录作业的编号

int addr=0;//内存的起始位置

int size=100;//分配的内存大小

}

建立两个链表avail和busy。avail里装的是待分配区,即空闲区域,busy装的是已分配内存的区域。

二.实验流程图

c0397f3b01bf218a9e246b1b78784815.png

1f6a18805ed6d3effbf9ed84295d7621.png

三.实验代码

package memory;

import java.util.ArrayList;

import java.util.Comparator;

import java.util.Scanner;

class sector{

int id = -1;//记录作业的编号

int addr=0;//内存的起始位置

int size=100;//分配的内存大小

}

class List extends ArrayList implements Comparator{

@Override

public int compare(sector o1, sector o2) {

if (o1.size < o2.size)

return 1;

if (o1.size > o2.size)

return -1;

else

return 0;

}

}

public class Allo {

Scanner sc = new Scanner(System.in);

List avail = new List();

ArrayList busy = new ArrayList<>();

sector sec;

public Allo(){

avail.add(new sector());

}

public void fenpei() {

sec = new sector();

System.out.println("输入作业编号及大小");

sec.id = sc.nextInt();

sec.size = sc.nextInt();

sector linshi = new sector();

boolean flag = false;

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

linshi = avail.get(i);

if (sec.size <= linshi.size) {

flag = true;

sec.addr = linshi.addr;

linshi.addr = linshi.addr + sec.size ;

linshi.size -= sec.size;

if (linshi.size >= 0 && linshi.size < 2) {

avail.remove(i);

}

busy.add(sec);

}

}

if(flag == false){

System.out.println("无可分配的内存!!清理后重试");

System.out.println("-----------------------");

System.out.println("-----------------------");

revoke();

}

}

private void revoke() {

// TODO Auto-generated method stub

sec = new sector();

sector linshi = new sector();

System.out.println("输入回收作业的编号");

int id = sc.nextInt();

boolean flag = false;

for (int i = 0; i < busy.size() && flag == false; i++) {

sec = busy.get(i);

if (sec.id == id) {

sec.id = -1;

flag = true;

busy.remove(i);

for (int j = 0; j < avail.size(); j++) {

linshi = avail.get(j);

if (linshi.addr + linshi.size == sec.addr) {

avail.remove(j);

linshi.size += sec.size;

avail.add(linshi);

break;

} else if (sec.addr + sec.size == linshi.addr) {

linshi.addr = sec.addr;

linshi.size += sec.size;

avail.remove(j);

avail.add(linshi);

break;

} else {

avail.add(sec);

break;

}

}

}

}

if (flag == true) {

System.out.println("回收成功");

System.out.println("-----------------------");

System.out.println("-----------------------");

} else {

System.out.println("回收失败,不存在此作业");

System.out.println("-----------------------");

System.out.println("-----------------------");

}

menu();

}

private void display() {

// TODO Auto-generated method stub

System.out.println("avail中的内容信息");

System.out.println("起始地址" + "\t" + "剩余大小");

sec = new sector();

int i;

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

sec = avail.get(i);

System.out.println(sec.addr + "------->" + sec.size);

}

System.out.println("----------------------------------");

System.out.println("----------------------------------");

if (busy.isEmpty()) {

System.out.println("busy中暂无信息!");

} else {

System.out.println("busy中的内容信息");

System.out.println("作业编号" + "\t" + "起始地址" + "\t" + "大小");

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

sec = busy.get(i);

System.out.println(sec.id + "------->" + sec.addr + "------->"

+ sec.size);

}

System.out.println("----------------------------------");

System.out.println("----------------------------------");

}

menu();

}

private void menu() {

// TODO Auto-generated method stub

System.out.println("请选择......");

System.out.println("Press 1分配内存");

System.out.println("Press 2回收内存");

System.out.println("Press 3显示内存信息");

int op = sc.nextInt();

switch (op) {

case 1:

int n;

System.out.println("输入要分配的作业个数");

n = sc.nextInt();

for(int i=0;i

fenpei();

}

menu();

break;

case 2:

revoke();

break;

case 3:

display();

break;

default:

System.out.println("输入有误!");

menu();

break;

}

}

public static void main(String[] args) {

// TODO Auto-generated method stub

Allo am = new Allo();

am.menu();

}

}

四.实验结果请选择......

Press 1分配内存

Press 2回收内存

Press 3显示内存信息

1

输入要分配的作业个数

3

输入作业编号及大小

1 14

输入作业编号及大小

2 21

输入作业编号及大小

3 51

请选择......

Press 1分配内存

Press 2回收内存

Press 3显示内存信息

3

avail中的内容信息

起始地址 剩余大小

86------->14

----------------------------------

----------------------------------

busy中的内容信息

作业编号 起始地址 大小

1------->0------->14

2------->14------->21

3------->35------->51

----------------------------------

----------------------------------

请选择......

Press 1分配内存

Press 2回收内存

Press 3显示内存信息

2

输入回收作业的编号

3

回收成功

-----------------------

-----------------------

请选择......

Press 1分配内存

Press 2回收内存

Press 3显示内存信息

3

avail中的内容信息

起始地址 剩余大小

35------->65

----------------------------------

----------------------------------

busy中的内容信息

作业编号 起始地址 大小

1------->0------->14

2------->14------->21

----------------------------------

----------------------------------

请选择......

Press 1分配内存

Press 2回收内存

Press 3显示内存信息

2

输入回收作业的编号

2

回收成功

-----------------------

-----------------------

请选择......

Press 1分配内存

Press 2回收内存

Press 3显示内存信息

3

avail中的内容信息

起始地址 剩余大小

14------->86

----------------------------------

----------------------------------

busy中的内容信息

作业编号 起始地址 大小

1------->0------->14

----------------------------------

----------------------------------

请选择......

Press 1分配内存

Press 2回收内存

Press 3显示内存信息

2

输入回收作业的编号

1

回收成功

-----------------------

-----------------------

请选择......

Press 1分配内存

Press 2回收内存

Press 3显示内存信息

3

avail中的内容信息

起始地址 剩余大小

0------->100

----------------------------------

----------------------------------

busy中暂无信息!

请选择......

Press 1分配内存

Press 2回收内存

Press 3显示内存信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值