1.Test.java

import java.util.Scanner;

public class Test {

public static void main(String[] args) {

Test.begin();

}

public static void begin(){

Free f=new Free();

Use u=new Use();

System.out.println("》》》--------------请选择操作----------《《《");

System.out.println("》》》--------------1.申请内存----------《《《");

System.out.println("》》》--------------2.释放内存----------《《《");

System.out.println("》》》--------------3.退出程序----------《《《");

Scanner sc=new Scanner(System.in);

int a=sc.nextInt();

while(a!=3){

switch(a){

case 1:u.use();break;

case 2:f.free();break;

}

System.out.println("》》》--------------请选择操作----------《《《");

System.out.println("》》》--------------1.申请内存----------《《《");

System.out.println("》》》--------------2.释放内存----------《《《");

System.out.println("》》》--------------3.退出程序----------《《《");

sc=new Scanner(System.in);

a=sc.nextInt();

}

System.out.println("系统退出成功!");

}

}

2.Use.java

import java.util.Scanner;

public class Use {

public static Node first=null;

public static Node tail=null;

public static int count=0;

public static int name=1;

public void use(){

System.out.println("请输入需要的内存空间:");

Scanner sc=new Scanner(System.in);

int a=Integer.parseInt(sc.nextLine());

if(a<=Free.all){

Node node=new Node();

if(count==0){

node.firstaddress=0;

node.length=a;

node.name=name;

first=node;

tail=node;

}

else{

node.firstaddress=tail.firstaddress+tail.length;

node.length=a;

node.name=name;

tail.next=node;

tail=node;

}

count++;

name++;

Free.all=Free.all-a;

}

else{

System.out.println("内存空间不够!");

}

Free.print();

}

}

3.Free.java

import java.util.Scanner;

public class Free {

public static Node first=null;

public static Node tail=null;

public static int count=0;

public static Node befortail=null;

public static int all=1000;

public void free(){

System.out.println("请输入要释放的内存块名:");

Scanner sc=new Scanner(System.in);

int a=Integer.parseInt(sc.nextLine());

Node node=new Node();

node=Use.first;

if(a==Use.first.name){

if(count==0){

first=node;

tail=node;

}

else{

tail.next=node;

tail=node;

}

Use.first=node.next;

}

else {

for(int i=0;i

if(node.name==a){

break;

}

befortail=node;

node=node.next;

}

if(count==0){

first=node;

tail=node;

}

else{

tail.next=node;

tail=node;

}

if(Use.tail!=Free.befortail.next){

Free.befortail.next=node.next;

}

else{

Use.tail=Free.befortail;

Use.tail.next=null;

}

}

count++;

Use.count--;

Free.merge();

Free.print();

}

public static void merge(){

Node[] node=new Node[100];

Node[] node2=new Node[100];

int a=0;

Node node1=new Node();

node1=first;

for(int i=0;i

if(node1!=null){

node[node1.name]=node1;

node1=node1.next;

}

}

for(int i=0;i<100;i++){

if(node[i]!=null){

node2[a]=node[i];

node2[a].next=null;

a++;

}

}

if(count>1){

for(int i=0;i

if(node2[i].firstaddress+node2[i].length==node2[i+1].firstaddress){

node2[i+1].firstaddress=node2[i].firstaddress;

node2[i+1].length=node2[i].length+node2[i+1].length;

node2[i]=null;

Free.count--;

}

}

}

if(node2[a-1].firstaddress+node2[a-1].length==1000-Free.all){

Free.all+=node2[a-1].length;

node2[a-1]=null;

Free.count--;

}

if(Free.count!=0){

if(node2[0]!=null){

first=node2[0];

}

else{

first=node2[1];

}

for(int i=0;i

if(node2[i]!=null){

befortail=node2[i];

befortail.next=node2[i+1];

}

}

}

}

public static void print(){

System.out.println("占用内存块表:");

System.out.println("内存块名 内存块首地址 内存块长");

Node node=new Node();

node=Use.first;

for(int i=0;i

if(node!=null){

System.out.println(" "+node.name+" "+node.firstaddress+" "+node.length);

node=node.next;

}

}

System.out.println("空闲内存块表:");

System.out.println("内存块名 内存块首地址 内存块长");

Node freenode=new Node();

freenode=Free.first;

for(int i=0;i

if(freenode!=null){

System.out.println(" "+freenode.name+" "+freenode.firstaddress+" "+freenode.length);

freenode=freenode.next;

}

}

}

}

4.Node.java

public class Node {

public int firstaddress;

public int length;

public int name;

public Node next;

}

实验5  内存管理(2学时)

一、实验目的

通过实验加强对内存管理方法的理解和掌握。

二、实验内容

编写程序实现采用可变分区方法管理内存。

三、实验要求

1、在该实验中,采用可变分区方式完成对存储空间的管理(即存储空间的分配与回收工作)。

2、设计用来记录主存使用情况的数据结构:已分区表和空闲分区表或链表。

3、在设计好的数据结构上设计一个主存分配算法(循环首次适应算法)。

4、在设计好的数据结构上设计一个主存回收算法。其中,若回收的分区有上邻空闲分区和(或)下邻空闲分区,要求合并为一个空闲分区登记在空闲分区表的一个表项里。

5、(附加)若需要可以实现程序的浮动,对内存空间进行紧凑

java的内存管理_操作系统实验——java内存管理相关推荐

  1. unity如何检测内存泄漏_如何排查Java内存泄漏?看懂这一篇就够用了

    原文:https://www.toptal.com/java/hunting-memory-leaks-in-java 作者:Jose Ferreirade Souza Filho 译者:Emma来源 ...

  2. java方法区内存泄露_深入理解java虚拟机-第二章:java内存区域与内存泄露异常...

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  3. java线程内存模型_深度解析Java多线程的内存模型

    内部java内存模型 硬件层面的内存模型 Java内存模型和硬件内存模型的联系 共享对象的可见性 资源竞速 Java内存模型很好的说明了JVM是如何在内存里工作的,JVM可以理解为java执行的一个操 ...

  4. java线程工作原型_深度解析Java内存的原型及工作原理

    本文主要通过分析Java内存分配的栈.堆以以及常量池详细的讲解了其的工作原理. 一.java虚拟机内存原型 寄存器:我们在程序中无法控制栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是 ...

  5. java内存 海子_[转]JVM的内存区域划分

    学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行 ...

  6. 可变分区存储管理实验报告总结_操作系统实验报告-可变分区存储管理方式的内存分配回收...

    一.实验目的 ( 1 )深入了解可变分区存储管理方式的内存分配回收的实现. 二.实验内容 编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表, 并采用最优适应算法完成内存的分配与回收 ...

  7. 全面理解java内存模型_深入理解Java内存模型(八)——总结

    处理器内存模型 顺序一致性内存模型是一个理论参考模型,JVM和处理器内存模型在设计时通常会把顺序一致性内存模型作为参照.JVM和处理器内存模型在设计时会对顺序一致性模型做一些放松,因为如果完全按照顺序 ...

  8. 操作系统内存管理_操作系统6内存管理基础

    引言 花了一段时间才把之前的笔记整理了一部分,平时太忙也没啥时间.今天开始整理内存管理部分的,内存管理部分大致分为三部分笔记,第一部分就是本篇内存管理基础,第二部分是虚拟内存,第三部分高速缓存. 一个 ...

  9. java策略管理_详解Java编程中的策略模式

    策略模式属于对象的行为模式.其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响到客户端的情况下发生变化. 策略模式的结构 策略模式 ...

最新文章

  1. mysql uuid 性能_mysql InnoDB UUID 主键 性能优化【性能分析篇】.md
  2. linux下多种锁的比较
  3. 程序异常异常代码: 0xc0000005_Java基础:看完这篇你还怕碰到异常吗?
  4. Interbase浴火重生:开源数据库Firebird更新到2.12
  5. SSH安全登陆原理:密码登陆与公钥登陆
  6. opencv2+ glob循环读入图片,将文件夹中的图片统一格式
  7. gridview RowCommand 事件获取行索引
  8. 阿里云DKMS对接记录
  9. Android 利用Canvas实现双指拖动和双指缩放图片
  10. oracle 进程cpu 高,oracle进程CPU占用太高
  11. 在微型计算机中,ram的特点是___.,2017计算机基础模拟试题「附答案」
  12. 亚马逊17亿美元收购iRobot;谷歌·Web性能权威指南电子书;宾大·现代统计学习课程资料;轻量化爬虫实现方案;前沿论文 | ShowMeAI资讯日报
  13. 【优秀的下载工具】Leech for Mac 3.1.4
  14. [ 个人住房担保委托贷款(住房公积金贷款)]
  15. 谷歌云指南_Google材料设计指南的10个重要要点
  16. 免费在线云服务CAD编辑软件AutoCAD易
  17. 第1课-OC对象原理基础
  18. apriori java_频繁模式挖掘apriori算法介绍及Java实现
  19. win10保存文件需要管理员权限无法保存
  20. OpenGL学习(九)阴影映射(shadowMapping)

热门文章

  1. 想要挑战成功的hongjin2
  2. 趣味故事嘛的facebook中文网
  3. 3月15日之前的FreeEIM
  4. 『转』数据库的委托之类型分类处理
  5. C\C++语言,从编程语言到库、API、框架、引擎
  6. 工作只用jquery,原生js知道就好了
  7. 完成杂志续订c语言程序,C语言程序设计报告杂志订阅管理软件.doc
  8. 代码编辑器sublime text 4使用小技巧--快捷键说明
  9. 1.7 编程基础之字符串 14 大小写字母互换 python
  10. 1268:【例9.12】完全背包问题