⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memorymanager.java

📁 一个用java编得简单的内存管理.实现内存的分配,内存大小为512MB.
💻 JAVA
字号:
//----------------------------------
//MemoryManager.java  
//
//Auther:Hu Dong 
//-----------------------------------
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.border.*;

//main函数所在类

public class  MemoryManager
{
	public static void main(String[] args)
	{
		MemoryManagerFrame MMF=new MemoryManagerFrame();
		MMF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		MMF.setVisible(true);
	}
} 
//窗体
class MemoryManagerFrame extends JFrame
{
	public MemoryManagerFrame()
	{
		setTitle("RamManager");
		setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
		//add MMP to frame
		
		MemoryManagerPane MMP=new MemoryManagerPane();
		add(MMP);	
	}
	
	public static final int DEFAULT_WIDTH=600;
	public static final int DEFAULT_HEIGHT=580;
}
//面板
class MemoryManagerPane extends JPanel 
{
	public MemoryManagerPane()
	{
		
		JPanel p1=new JPanel();
		JPanel p2=new JPanel();
		p1.setLayout(new GridBagLayout());
		p2.setLayout(new BorderLayout());
		//border
		Border etched=BorderFactory.createEtchedBorder();
		Border title1=BorderFactory.createTitledBorder(etched,"操作");
		Border title2=BorderFactory.createTitledBorder(etched,"状态");
		p1.setBorder(title1);
		p2.setBorder(title2);
		//
		s[0][0]=0;s[0][1]=0;s[0][2]=512;s[0][3]=1;//1表示该内存可用
		//
		final JTable table=new JTable(s,colmenu);
		JScrollPane t = new JScrollPane(table);

		//Button Action one 
		btn1.addActionListener(
			new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					int i=0;
										
					if(tf1.getText().equals(""))  //判断用户是否输入数据
					{
						int confirm=JOptionPane.showConfirmDialog(null,"输入有误!","错误信息",
 	  															 JOptionPane.OK_CANCEL_OPTION,
 	  														      JOptionPane.WARNING_MESSAGE);
    					if(confirm==JOptionPane.CANCEL_OPTION)
    						System.exit(0);	
					}
					int r=Integer.parseInt(tf1.getText().trim());
					
					for(i=0;i<30;i++) //i指示table中的最后一行
					{
						if(s[i][3]==1) break;
					}
					if(r<=s[i][2]) //内存足够时进行分配
					{
						s[i+1][0]=s[i][0]+1;
						s[i+1][1]=s[i][1]+r;
						s[i+1][2]=s[i][2]-r;
						s[i+1][3]=1;
						s[i][2]=r;
						s[i][3]=0;
					}
					else   //内存不足,报错
					{	
 	  					int confirm=JOptionPane.showConfirmDialog(null,"内存不够!","错误信息",
 	  															 JOptionPane.OK_CANCEL_OPTION,
 	  														      JOptionPane.WARNING_MESSAGE);
    					if(confirm==JOptionPane.CANCEL_OPTION)
    						System.exit(0);	
    				}
					table.updateUI();	
				}
			}
			);

		//Buton Action two
		btn2.addActionListener(     
			new ActionListener()
			{
				public void actionPerformed(ActionEvent e)
				{
					int i=0;
					
					if(tf2.getText().equals(""))  //判断用户是否输入数据
					{
						int confirm=JOptionPane.showConfirmDialog(null,"输入有误!","错误信息",
 	  															 JOptionPane.OK_CANCEL_OPTION,
 	  														      JOptionPane.WARNING_MESSAGE);
    					if(confirm==JOptionPane.CANCEL_OPTION)
    						System.exit(0);	
					}
					int id=Integer.parseInt(tf2.getText());
					
					for(i=0;i<30;i++)//i指示table中的最后一行
					{
						if(s[i][3]==1) break;
					}
					if(i==0)  //没有内存分配
					{	
 	  					int confirm=JOptionPane.showConfirmDialog(null,"该内存没有分配!","错误信息",
 	  															 JOptionPane.OK_CANCEL_OPTION,
 	  														      JOptionPane.WARNING_MESSAGE);
    					if(confirm==JOptionPane.CANCEL_OPTION)
    						System.exit(0);	
    				}
    				else
    				{ 
						if(id==0) //当释放第一块内存区域时
						{
							if(i==1)  //当只有第一块内存分配时
							{
								s[0][0]=0;s[0][1]=0;s[0][2]=512;s[0][3]=1;
								//置i行属性值为null
								s[i][0]=null;s[i][1]=null;s[i][2]=null;s[i][3]=null;		
							}
							else
							{
						
								int sum=0;//计算s[][2]
								
								s[0][3]=s[1][3];
								for(int j=1;j<(i-1);j++)
								{
									sum+=s[j][2];
									s[j][1]=sum;
									s[j][2]=s[j+1][2];
								}
								s[i-1][1]=sum+s[i-1][2];
								s[i-1][2]=512-s[i-1][1];
								s[i-1][3]=1;
								
								s[i][0]=null;s[i][1]=null;s[i][2]=null;s[i][3]=null;		
							}
						}
						else if(id<i)  //当释放中间内存区域时
						{
							for(int j=id;j<i;j++)
							{
								if(j==(i-1)) //当j到达i的下一行时,需要单独考虑
								{
									s[j][2]=512-s[j][1]; 
									s[j][3]=1;
								}
								else
								{
									s[j][2]=s[j+1][2];
									s[j+1][1]=s[j][1]+s[j][2];
								}
							}
							s[i][0]=null;s[i][1]=null;s[i][2]=null;s[i][3]=null;
						}
						else 
						{	
	 	  					int confirm=JOptionPane.showConfirmDialog(null,"该内存未分配!","错误信息",
	 	  															 JOptionPane.OK_CANCEL_OPTION,
	 	  														      JOptionPane.WARNING_MESSAGE);
	    					if(confirm==JOptionPane.CANCEL_OPTION)
	    						System.exit(0);	
	    				}
	    			}
					table.updateUI();	
				}
			}
			);		
		//add components into panel1
		p1.add(a1, new GBC(0,0));
		p1.add(a2,new GBC(0,1));
		p1.add(tf1, new GBC(1,0));
		p1.add(tf2, new GBC(1,1));
		p1.add(a3, new GBC(2,0));
		p1.add(btn1, new GBC(3,0));
		p1.add(btn2, new GBC(3,1));
		//add components into panel2
		p2.add(t, BorderLayout.CENTER); 
		//JFrame中添加两个Panel
		add(p1);
		add(p2);	
	}
	
	private JLabel a1=new JLabel("要申请的内存大小");
	private JLabel a2=new JLabel("要结束的内存ID");
	private JLabel a3=new JLabel("MBytes 0~512");
	
	private JTextField tf1=new JTextField(10);
	private JTextField tf2=new JTextField(10);
	
	private JButton btn1=new JButton("分配");
	private JButton btn2=new JButton("释放");
	
	private Integer[][] s=new Integer[30][4];
	
	private String[] colmenu={"ID","起始地址","块大小","块状态"};
		
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -