日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2024/7/19 java 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java动态内存分部,如何利用Java实现动态内存分配? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.實(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("無(wú)可分配的內(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中暫無(wú)信息!");

} 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中暫無(wú)信息!

請(qǐng)選擇......

Press 1分配內(nèi)存

Press 2回收內(nèi)存

Press 3顯示內(nèi)存信息

總結(jié)

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

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。