Java垃圾回收机制介绍
2019-04-04 本文已影响0人
测试老杨
Java垃圾回收机制
Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Heap)中分配的,所有对象的回收都是由Java虚拟机通过垃圾回收机制完成的。GC为了能够正确释放对象,会监控每个对象的运行状况,对他们的申请、引用、被引用、赋值等状况进行监控,Java会使用有向图的方法进行管理内存,实时监控对象是否可以达到,如果不可到达,则就将其回收。
学生删除功能分析
运行学生管理系统,在控制台录入5名学生的数据,然后将第3名学生王五从系统里面删除,会导致王五后面的学生向前移动,并且最后一个学生空间会被更新为null。另外,王五被删除后,该学生由于没有被任何引用变量所引用,成为了垃圾数据,最终会被Java垃圾回收工具回收。王五这个学生的学号,年龄等成员属性(成员变量)的生命周期为从该学生被创建一直到被Java垃圾回收机制回收。
image.png
添加5名学生
image.png使用监控工具查看学生实例
image.png删除第3个学生王五
image.png使用监控工具查看学生数组
image.png使用监控工具查看学生实例
image.png学生类的源代码
package day07;
public class Student {
static{
System.out.println("学生模板被加载");
}
int sid;//成员变量
String sname;
int age;
boolean isMale;
public static int count;//表示学生的数量
/**
* 查询学生的年龄
* @return
*/
public int getAge() {
return age;
}
/**
* 修改学生的年龄
* @param age
*/
public void setAge(int age) {
if(age>=1){
this.age = age;
}
}
public Student(){
}
/**
*
* @param sid 表示学号
* @param sname 表示姓名
* @param age 表示年龄
* @param isMale 表示性别
*/
public Student(int sid,String sname,int age,boolean isMale){
this.sid=sid;
this.sname=sname;
this.isMale=isMale;
if(age>=1){
this.age=age;
}
}
/**
* 学生做自我介绍
*/
public void selfInfo(){
System.out.println("大家好!我叫"+sname+",今年"+age+"岁");
}
}
学生管理系统主程序的源代码
package day07;
import java.util.Scanner;
public class StudentTest {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
Student[] students=new Student[5];
int sno;
String sname;//
int age;
int index=0;
System.out.println("欢迎使用学生管理系统");
boolean isMale;
int location;
int cmd;//表示用户的指令
do{
System.out.println("添加学生请输入:1");
System.out.println("查询学生请输入:2");
System.out.println("删除学生请输入:3");
System.out.println("退出系统请输入:0");
cmd=scan.nextInt();
switch (cmd) {
case 0:
break;
case 1:
isMale=false;
System.out.println("请输入学号:");
sno=scan.nextInt();
System.out.println("请输入姓名:");
sname=scan.next();
System.out.println("请输入年龄:");
age=scan.nextInt();
System.out.println("是否为男(Y/N):");
if(scan.next().toLowerCase().matches("^y|yes$")){
isMale=true;
}
students[index]=new Student(sno,sname,age,isMale);//把学生对象保存到数组里面
index++;
System.out.println("已成功添加该学生!");
break;
case 2:
location=-1;
System.out.println("请输入学号:");
sno=scan.nextInt();
for(int i=0;i<students.length;i++){
if(students[i]==null){
break;
}
if(students[i].sid==sno){
location=i;
System.out.println(
students[i].sid+","+students[i].sname+","+students[i].age+","+(students[i].isMale?"男":"女"));
break;
}
}
if(location==-1){
System.out.println("找不到该学生!");
}
break;
case 3:
location=-1;
System.out.println("请输入学号:");
sno=scan.nextInt();
for(int i=0;i<students.length;i++){
if(students[i]==null){
break;
}
if(students[i].sid==sno){
location=i;
System.out.println(
students[i].sid+","+students[i].sname+","+students[i].age+","+(students[i].isMale?"男":"女"));
break;
}
}
if(location==-1){
System.out.println("找不到该学生!");
}else{
//删除该学生
for(int i=location;i<students.length-1;i++){//location=2
students[i]=students[i+1];
}
students[students.length-1]=null;
index--;
System.out.println("已成功删除该学生");
}
break;
default:
System.out.println("输入的命令错误!");
break;
}
if(cmd==0){
System.out.println("Bye!Bye!");
break;//跳出循环
}
}while(true);
scan.close();
}
}
参考资料
Java内存泄漏与内存溢出
https://www.cnblogs.com/panxuejun/p/5883044.html
Java垃圾回收机制
https://www.cnblogs.com/dolphin0520/p/3783345.html