日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2024/7/19 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java动态内存分部,如何利用Java实现动态内存分配? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.實驗原理

原理:內存以分區為單位,每個分區可由(ID,addr,size,)進行描述

class sector{

int id = -1;//記錄作業的編號

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

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

}

建立兩個鏈表avail和busy。avail里裝的是待分配區,即空閑區域,busy裝的是已分配內存的區域。

二.實驗流程圖

三.實驗代碼

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顯示內存信息

總結

以上是生活随笔為你收集整理的java动态内存分部,如何利用Java实现动态内存分配?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。