java动态内存分部,如何利用Java实现动态内存分配?
一.實(shí)驗(yàn)原理
原理:內(nèi)存以分區(qū)為單位,每個(gè)分區(qū)可由(ID,addr,size,)進(jìn)行描述
class sector{
int id = -1;//記錄作業(yè)的編號(hào)
int addr=0;//內(nèi)存的起始位置
int size=100;//分配的內(nèi)存大小
}
建立兩個(gè)鏈表avail和busy。avail里裝的是待分配區(qū),即空閑區(qū)域,busy裝的是已分配內(nèi)存的區(qū)域。
二.實(shí)驗(yàn)流程圖
三.實(shí)驗(yàn)代碼
package memory;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Scanner;
class sector{
int id = -1;//記錄作業(yè)的編號(hào)
int addr=0;//內(nèi)存的起始位置
int size=100;//分配的內(nèi)存大小
}
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("輸入作業(yè)編號(hào)及大小");
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("無可分配的內(nèi)存!!清理后重試");
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("輸入回收作業(yè)的編號(hào)");
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("回收失敗,不存在此作業(yè)");
System.out.println("-----------------------");
System.out.println("-----------------------");
}
menu();
}
private void display() {
// TODO Auto-generated method stub
System.out.println("avail中的內(nèi)容信息");
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中的內(nèi)容信息");
System.out.println("作業(yè)編號(hào)" + "\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("請(qǐng)選擇......");
System.out.println("Press 1分配內(nèi)存");
System.out.println("Press 2回收內(nèi)存");
System.out.println("Press 3顯示內(nèi)存信息");
int op = sc.nextInt();
switch (op) {
case 1:
int n;
System.out.println("輸入要分配的作業(yè)個(gè)數(shù)");
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();
}
}
四.實(shí)驗(yàn)結(jié)果請(qǐng)選擇......
Press 1分配內(nèi)存
Press 2回收內(nèi)存
Press 3顯示內(nèi)存信息
1
輸入要分配的作業(yè)個(gè)數(shù)
3
輸入作業(yè)編號(hào)及大小
1 14
輸入作業(yè)編號(hào)及大小
2 21
輸入作業(yè)編號(hào)及大小
3 51
請(qǐng)選擇......
Press 1分配內(nèi)存
Press 2回收內(nèi)存
Press 3顯示內(nèi)存信息
3
avail中的內(nèi)容信息
起始地址?剩余大小
86------->14
----------------------------------
----------------------------------
busy中的內(nèi)容信息
作業(yè)編號(hào)?起始地址?大小
1------->0------->14
2------->14------->21
3------->35------->51
----------------------------------
----------------------------------
請(qǐng)選擇......
Press 1分配內(nèi)存
Press 2回收內(nèi)存
Press 3顯示內(nèi)存信息
2
輸入回收作業(yè)的編號(hào)
3
回收成功
-----------------------
-----------------------
請(qǐng)選擇......
Press 1分配內(nèi)存
Press 2回收內(nèi)存
Press 3顯示內(nèi)存信息
3
avail中的內(nèi)容信息
起始地址?剩余大小
35------->65
----------------------------------
----------------------------------
busy中的內(nèi)容信息
作業(yè)編號(hào)?起始地址?大小
1------->0------->14
2------->14------->21
----------------------------------
----------------------------------
請(qǐng)選擇......
Press 1分配內(nèi)存
Press 2回收內(nèi)存
Press 3顯示內(nèi)存信息
2
輸入回收作業(yè)的編號(hào)
2
回收成功
-----------------------
-----------------------
請(qǐng)選擇......
Press 1分配內(nèi)存
Press 2回收內(nèi)存
Press 3顯示內(nèi)存信息
3
avail中的內(nèi)容信息
起始地址?剩余大小
14------->86
----------------------------------
----------------------------------
busy中的內(nèi)容信息
作業(yè)編號(hào)?起始地址?大小
1------->0------->14
----------------------------------
----------------------------------
請(qǐng)選擇......
Press 1分配內(nèi)存
Press 2回收內(nèi)存
Press 3顯示內(nèi)存信息
2
輸入回收作業(yè)的編號(hào)
1
回收成功
-----------------------
-----------------------
請(qǐng)選擇......
Press 1分配內(nèi)存
Press 2回收內(nèi)存
Press 3顯示內(nèi)存信息
3
avail中的內(nèi)容信息
起始地址?剩余大小
0------->100
----------------------------------
----------------------------------
busy中暫無信息!
請(qǐng)選擇......
Press 1分配內(nèi)存
Press 2回收內(nèi)存
Press 3顯示內(nèi)存信息
總結(jié)
以上是生活随笔為你收集整理的java动态内存分部,如何利用Java实现动态内存分配?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 设计模式 优缺点_java设计
- 下一篇: php querystring使用,no