newProcess=myList.get(i);
showList.add(newProcess.getName());
}
}
分配内存的监视器主要代码:
publicclassAssignMemoryListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
//当输入分配内存大小不完整时提示
if((mbField.getText().equals(""))||(kbField.getText().equals(""))||(byteField.getText().equals(""))){
JOptionPane.showMessageDialog(null,"请完整输入所需分配内存的大小","警告对话框",JOptionPane.WARNING_MESSAGE);
}
else{
//当内存不足时
if(Integer.parseInt(mbField.getText())*1024*1024+Integer.parseInt(kbField.getText())*1024+Integer.parseInt(byteField.getText())>(m*1024*1024+k*1024+b)){
JOptionPane.showMessageDialog(null,"所剩内存不足","警告对话框",JOptionPane.WARNING_MESSAGE);
}
else{
Stringname=JOptionPane.showInputDialog(null,"输入进程名字","输入对话框",JOptionPane.PLAIN_MESSAGE);//获得分配内存名字
ProcessnewProcess=newProcess();
newProcess.setName(name);
newProcess.setSize(Integer.parseInt(mbField.getText())*1024*1024+Integer.parseInt(kbField.getText())*1024+Integer.parseInt(byteField.getText()));
size=newProcess.getSize();
fsize=size;//把size转成float类型计算,小数计算必须要化成整形
px=(int)(450/p*fsize);//获得像素的长度
newProcess.setBeginPx(index);
newProcess.setEndPx(index+px);
index=index+px;
myList.add(newProcess);//把进程添加到链表中
//绘图
repaint();
showListName(myList);//显示所用进程的名字
//三个输入框清空
mbField.setText("");
kbField.setText("");
byteField.setText("");
//更改剩余内存值
intleftSize=(m*1024*1024+k*1024+b)-size;
m=leftSize/(1024*1024);
k=leftSize/1024%1024;
b=leftSize%1024;
notice2.setText("可分配最大内存:
"+m+"MB"+k+"KB"+b+"Byte");
}
}
}
}
输入要分配的内存大小:
图1分配内存
输入名字:
图2输入名字
分配两个内存:
图3分配两个内存
3.用户选择已分配的内存名字而回收相应的内存模块:
回收流程图:
回收内存主要代码:
publicclassCollectMemoryListenerimplementsActionListener{
publicvoidactionPerformed(ActionEventarg0){
intnum=showList.getSelectedIndex();//获得被选中的序号
//更新剩余内存值
intreleaseSize=myList.get(num).getSize();
m=m+releaseSize/(1024*1024);
k=k+releaseSize/1024%1024;
b=b+releaseSize%1024;
notice2.setText("可分配最大内存:
"+m+"MB"+k+"KB"+b+"Byte");
//从链表中删去该进程
myList.remove(num);
showListName(myList);
repaint();
}
}
回收第一个内存后,绘图更新,剩余内存更新:
图4回收第一个已分配的内存
重新整合内存主要代码:
publicclassRefreshMemoryListenerimplementsActionListener{
publicvoidactionPerformed(ActionEvente){
if(myList.size()!
=0){
index=20;
for(inti=0;isize=myList.get(i).getSize();
fsize=size;//把size转成float类型计算
px=(int)(450/p*fsize);//获得像素的长度
myList.get(i).setBeginPx(index);
myList.get(i).setEndPx(index+px);
index=index+px;
}
repaint();
}
}
}
图5重新整合内存
四、实验总结
通过本次实验,加深了对内存管理的理解。
并掌握了单链表应用的重要方法。
运用java的GUI为客户端整体布局,并且运用paint()方法来表示内存分配的状态。
一个已分配的内存表示一个对象,所有对象都存放在链表中,当回收内存时则把改对象在链表中移除。
每次绘图都是根据链表中存在的对象而绘画。
由于对象中存放有起点的像素和终点的像素,因而实现起来简单。