一.实验原理

原理:内存以分区为单位,每个分区可由(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实现动态内存分配?相关推荐

  1. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作

    一.如何实现不同类型对象之间的复制问题? 1.为什么会有这个问题? 近来在进行一个项目开发的时候,为了隐藏后端数据库表结构.同时也为了配合给前端一个更友好的API接口文档(swagger API文档) ...

  2. java excel 设置行高 jxi_利用Java控制EXCEL实例详解

    使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel文件并不是一件容易的事.在Web应用日益盛行的今天,通过Web来操作Excel文件的需求越来 ...

  3. java 避免大量if else_利用java的反射避免 多个 if else if else if else if

    现在有一个场景: 有一个方法,他的作用是接收命令(字符串类型的)和该命令对应的参数. 这样的命令有N多个.这样的一个方法怎么实现? 按照传统的面向过程的思维:字符串操作截取出命令的String值.根据 ...

  4. java mysql jdbc 封装_利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包括增删改查、JavaBean反射原理,附源代码)...

    近期看老罗的视频,跟着完毕了利用Java操作MySql数据库的一个框架类JdbcUtils.java,完毕对数据库的增删改查.当中查询这块,包含普通的查询和利用反射完毕的查询,主要包含以下几个函数接口 ...

  5. java break递归_如何利用Java递归解决“九连环”公式

    在之前有写到过一点点有关递归的东西,然后想到小时候自己玩的一个玩具--九连环.小时候自己曾经一边玩一边用笔记下来解开这个东西的公式,那是十几年前的事情了.前两天突然想起来,九连环的基本操作就是一个递归 ...

  6. java界面设计股票_利用JAVA实现股票交易系统设计参考.doc

    利用JAVA实现股票交易系统设计参考 目 录 摘要1 关键词1 Abstract2 Key words2 1 概述3 1.1 Java体系结构3 1.2 Java的优点3 1.3 Java的应用3 2 ...

  7. java 递归10 28_如何利用Java递归解决“九连环”公式

    在之前有写到过一点点有关递归的东西点击打开链接,然后想到小时候自己玩的一个玩具--九连环.小时候自己曾经一边玩一边用笔记下来解开这个东西的公式,那是十几年前的事情了.前两天突然想起来,九连环的基本操作 ...

  8. java calendar日期计算_利用Java中Calendar计算两个日期之间的天数和周数

    前言 究竟什么是一个 Calendar 呢?中文的翻译就是日历,那我们立刻可以想到我们生活中有阳(公)历.阴(农)历之分.它们的区别在哪呢? 比如有: 月份的定义 - 阳`(公)历 一年12 个月,每 ...

  9. java 方法数统计_利用Java简单实现一个代码行数统计器方法实例

    前言 哈喽,我是小黑, 最近学了java的输入输出流后一直心痒痒,总想找一点事情来做,所以用java代码来实现了一下统计代码的所有行数,看一下我上大学以来到底打了多少行. 先附上实现代码吧! pack ...

最新文章

  1. 数据库高可用性——SQL Server 2005数据库复制简单图解
  2. 【ICML 2020】REALM: Retrieval-Augmented Language Model PreTraining
  3. 网易云信集成视频教程(三):如何通过SDK实现自定义消息?
  4. Java 冒泡排序的实现
  5. pat 乙级 1037 在霍格沃茨找零钱(C++)
  6. 南京Uber优步司机奖励政策(12月28日到1月3日)
  7. linux下进程监控6,Linux进程监控技术—精通软件性能测试与LoadRunner最佳实战(6)...
  8. Keras---text.Tokenizer:文本与序列预处理
  9. hive serde 序列化与反序列化 - 一行数据写入hive表
  10. gRPC入门教程汇总
  11. 用 RxSwift 实现通用的响应式转场
  12. PHP面向对象(OOP)----分页类 1
  13. bzoj 3036: 绿豆蛙的归宿(Dp)
  14. [Web开发] Web程序调式的利器 - Fiddler (HTTP协议监视工具)
  15. python数据结构之递归
  16. caffe安装成功后测试
  17. tomcat:日志配置详解(避免日志过多撑爆磁盘)
  18. 物业公众号推文范例_《爱物业》物业服务公众号平台
  19. Java控制鼠标和键盘的方法
  20. JavaScript反爬之哈希算法

热门文章

  1. lammps软件_Lammps模型构建的方法之一:组合模型构建
  2. 无向图的深度优先遍历非递归_【数据结构图(一)】什么是图
  3. K-Means算法和K-Means++算法的聚类
  4. 2.MongoDB基本操作
  5. python手枪_Python入门,爬虫训练——枪械查询
  6. 知识图谱论文阅读(二十一)【SIGIR2019】NGCF: Neural Graph Collaborative Filtering
  7. 安利几个优质NLP开源项目!搜索、问答、情感分析…
  8. Spring Cloud Alibaba基础教程:与Dubbo的完美融合
  9. 会议交流 | 人工智能与机器学习创新峰会 - 知识图谱与图神经网络分会
  10. 论文浅尝 | 基于Freebase的问答研究