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显示内存信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

postgresql两个列模糊比较_JDBC进阶(一):批处理与获取自增长列的值

一、批处理假如要插入一万条记录到数据表中&#xff0c;那么使用普通的方法就要执行一万次插入操作&#xff0c;这样会频繁打开和关闭数据库连接&#xff0c;导致执行速度变慢。因此可以使用批处理机制将多条语句一次性提交给数据库批量处理。批处理的相关API&#xff1a;void …

深度解读后疫情时代下,零售行业的趋势及技术前瞻

来源&#xff1a;苏宁零售技术研究院作者&#xff1a;王俊杰、罗海棠博士、郭永慧、池曙强、张绿漪博士新冠状病毒肺炎疫情发展严峻&#xff0c;短时间内席卷全国。民众在政府的号召下选择了尽量不出行&#xff0c;餐饮、旅游、线下零售等行业面临严峻考验。但同时&#xff0c;…

JAVA-配置path环境

配置path环境变量变的目的是什么&#xff1f; 控制台可以在任意的路径下都可以找到java的开发工具。 为了说明几个JDK环境变量的作用&#xff0c;这里先给出环境变量的定义 环境变量&#xff1a; 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;比…

170页PPT入门深度强化学习! 汪荣贵 图灵人工智能 昨天

转自&#xff1a;中国图象图形学报什么是强化学习&#xff1f;和其他学习方法相比&#xff0c;有何不同与特色&#xff1f;深度学习如何与强化学习结合&#xff1f;并各取所长&#xff1f;深度强化学习会成为未来引领智能计算的方法吗&#xff1f;深度强化学习将强化学习和深度…

钟南山院士应邀向欧洲同仁全方位解析新冠肺炎(配中文文字版)

来源&#xff1a;ERS欧洲呼吸学会尊敬的同事们&#xff0c;女士们&#xff0c;先生们&#xff1a;非常荣幸能有机会与您分享我们处理中国境内COVID19感染的相关经验。在这种情况下&#xff0c;我仍然在前线工作&#xff0c;所以准备这个PPT比较匆忙。我只能告诉您一些事实、某些…

powerbi的功能介绍_Power BI性能提升的5大秘密武器

​Power BI无疑已经走了很长一段路&#xff0c;它以其作为自助服务工具的强大根基&#xff0c;易于使用的功能以及在企业领域的持续推动和推动而发展。但是&#xff0c;我们仍然可以发现许多开发和维护Power BI解决方案可以通过应用一些更改而受益匪浅&#xff0c;这些更改将导…

递归推导——猜年龄

一、问题描述 班里转来了一位新同学&#xff0c;他在介绍自己年龄的时候说&#xff1a;“我的年龄的平方是一个三位数&#xff0c;立方是一个四位数&#xff0c;四次方是一个六位数。三次方和四次方正好将0/1/2/3/4/5/6/7/8/9这10个数字全部覆盖。”&#xff0c;那么&#xff0…

matlab画布透明,MATLAB怎么生成带透明对象的矢量图

从很早的版本开始MATLAB就支持对patch、surface等对象设定透明属性&#xff0c;有些示意图也必须使用透明的对象才能充分展示所要表达的含义。对透明对象支持最好的通用图片格式就是.png了&#xff0c;但是png图像并非矢量图形&#xff0c;对于一些需要以矢量图显示的场合并不适…

综述:持续感知系统在边缘计算的应用

来源&#xff1a;《微纳电子与智能制造》随着边缘计算技术的兴起&#xff0c;各种各样的感知系统给人类带来了便捷高效的生活。以日常使用的手机为例&#xff0c;工程师为其置入了各种各样的传感器&#xff0c;并通过运行其上的机器学习算法&#xff0c;部署了很多便捷的功能。…

matlab fgoalattain,matlab优化工具箱 | 学步园

1工具箱概述1.1 功能(1)求解无约束条件非线性极小值&#xff1b;(2)求解约束条件下非线性极小值&#xff0c;包括目标逼近问题、极大-极小值问题和半无限极小值问题&#xff1b;(3)求解二次规划和线性规划问题&#xff1b;(4)非线性最小二乘逼近和曲线拟合&#xff1b;(5)非线性…

自保护、人机互动柔性织物传感器研究取得进展

来源&#xff1a;中国科学院宁波材料技术与工程研究所可穿戴柔性电子器件&#xff0c;因其柔性/拉伸性、质轻、成本低、便携等特性&#xff0c;被广泛应用于人体运动/人体健康的实时监测、人机/脑机交互以及机器学习等领域。但目前仍存在灵敏度及响应速度较低、检测下限较高、检…

Hibernate第十一篇【配置C3P0数据库连接池、线程Session】

Hibernate连接池 Hibernate自带了连接池&#xff0c;但是呢&#xff0c;该连接池比较简单..而Hibernate又对C3P0这个连接池支持…因此我们来更换Hibernate连接池为C3P0 查看Hibernate自带的连接池 我们可以通过Hibernate.properties文件中查看Hibernate默认配置的连接池 hibern…

npm 切换源_【分享吧】verdaccio搭建npm私有仓库

verdaccio搭建npm私有仓库前言随着前端技术的不断发展&#xff0c;前后端分离已成为主流趋势&#xff0c;这就导致了前端承受的分工压力会越来越大&#xff0c;前端项目也将变得十分庞杂&#xff0c;因此在技术方面会考虑按照业务线进行拆分成几个业务系统。这些系统之间如何共…

疫情中的人工智能和大数据“社会实验”,将如何影响我国经济社会发展

来源&#xff1a;三思派最近&#xff0c;上海市科学学研究所编制了《人工智能、大数据支撑新冠肺炎疫情防控报告&#xff08;1.0版&#xff09;》。报告预测&#xff0c;疫情过后&#xff0c;人们的生活和工作方式都可能向更加智能化方向发展&#xff0c;一个以智能化、无人化、…

IBM强化Watson对商业语言的理解能力—AI辩论一些关键技术首次商业化

来源&#xff1a;IBM中国2020 年 3 月 11 日&#xff0c;商业人工智能领域领军者 IBM[1]宣布推出几项全新的 IBM Watson 技术&#xff0c;旨在帮助组织机构更清晰地识别、理解和分析英语语言中某些最具挑战性的方面&#xff0c;从而获取更多洞察。全新的 IBM Watson 技术代表着…

删除快捷方式小箭头_修复快捷方式的箭头图标

前一天晚上&#xff0c;用360清理缓存文件后&#xff0c;早上起来一看快捷方式的箭头图标不见了&#xff0c;左下角变成了一片白色。试了很多方法&#xff0c;比如说删除iconcache.db&#xff0c;然后重启资源管理器等等&#xff0c;发现没有用。然后&#xff0c;装上360桌面助…

如何实现对外部php文件的调用,laravel如何引用外部文件

laravel如何引用外部文件,主视图,视图,文件,方式,内容laravel如何引用外部文件易采站长站&#xff0c;站长之家为您整理了laravel如何引用外部文件的相关内容。(1)、首先在app\Http\routes.php中定义路由&#xff1b;Route::get(view,ViewControllerview);Route::get(article,V…

清华大学人工智能深度报告:八大维度解析机器学习

来源&#xff1a;世界人工智能大会机器学习&#xff08;Machine Learning&#xff0c;常简称为 ML&#xff09;已经成为了当今的热门话题&#xff0c;从机器学习概念诞生到机器学习技术的普遍应用经过了漫长的过程&#xff0c;众多优秀的学者为推动机器学习的发展做出了巨大的贡…

【周末阅读】5G时代新型基础设施建设白皮书

来源&#xff1a;智东西【导读】当今世界&#xff0c;新一代信息技术与经济社会深度交融&#xff0c;正引领全球新一轮科技革命和产业变革&#xff0c;其速度、广度、深度前所未有。加快 5G 商用和人工智能、工业互联网、物联网等新型基础设施建设是发挥投资关键作用&#xff0…

pandas取出某一列_Pandas高级运算 | apply与applymap方法详解

大家好&#xff0c;今天我们来聊聊pandas的一些高级运算。在之前文章中&#xff0c;我们介绍了panads的一些计算方法&#xff0c;比如两个dataframe的四则运算&#xff0c;以及dataframe填充Null的方法。今天这篇文章我们来聊聊dataframe中的广播机制&#xff0c;以及apply函数…