关于JavaGC和我的堆栈实现链接列表

rwqw0loc  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(299)

我一天前决定开始学习java。我选择实现一个堆栈(链表实现)和其他数据结构来学习它,但是我不太确定我的代码,以及java的gc的行为,你们能检查一下我的代码是对的还是错的吗?
很抱歉,我不知道有哪个javaMaven会问我是否做得对。
顺便说一句,我来自c和c++并且我对我的程序占用的内存非常熟悉。
我试着运行这个程序,并推了500mb的内存,然后当我使用.pop()方法时,内存没有下降,我也等了20分钟,什么也没发生。我读到的是java自动为我们释放内存,但由于我没有看到内存下降,感觉我做错了。
我的堆栈

import java.util.Scanner;

// ------------------------  node  ------------------------
class node<type>{
    type value;
    node<type> prev;

    node(type value){
        this.value = value;
    }

    // for checking I guess
    void recdisp(node<type> recurs){
        if(recurs != null){
            System.out.println(recurs.value);
            recurs.recdisp(recurs.prev);
        }
        return;
    }
}

// ------------------------  STACK  ------------------------
class mystack<type>{
    node<type> top;

    mystack(type value){
        top = new node<type>(value);
        top.prev = null;
    }

    void push(type value){
        node<type> buffer = new node<type>(value);
        buffer.prev = top;
        top = buffer;
        buffer = null;
    }

    type pop(){
        node<type> tmp;
        if(top == null){
            System.out.println("POP: Stack is Empty");
            return null;
        }
        type pass = top.value;
        tmp = top;
        top = top.prev;
        tmp = null;
        return pass;
    }

    void peek(){
        System.out.println("TOP VALUE : "+top.value);
    }

    void display(){
        if(top != null)
            top.recdisp(top);
        else
            System.out.println("Display: Stack is empty");
    }
}

//  ------------------------  MAIN CLASS  ------------------------
public class myjava{
    public static void main(String []args){

        mystack<Integer> stacks = new mystack<Integer>(5);
        stacks.pop();
        stacks.pop();
        stacks.pop();
        stacks.display();

        stacks.push(10);
        stacks.push(20);
        stacks.push(30);
        stacks.push(40);

        stacks.display();
    }
}
of1yzvn4

of1yzvn41#

这里涉及到几个概念。
jvm为应用程序提供自动内存管理。与c不同,您不需要显式地为对象分配空间;jvm将在堆中为您做这些。当您不再有对对象的任何引用时,它就可以进行垃圾收集。重要的是要认识到,何时(甚至是否)将收集的对象是不能保证的。
大多数gc算法使用一代堆空间(将其分为年轻一代和老年一代)。几乎所有创建的对象都只在很短的时间内被引用。大多数对象都是在年轻一代收集的,减少了老一代的负担。
直到最近,jvm还不愿意将未使用的堆内存返回到操作系统。在jdk12中,jep346为g1收集器引入了即时内存释放。其他一些收藏家也做类似的事情,但不是全部。
从你的问题来看,不可能确切地说发生了什么。您不需要说明堆有多大(或者机器有多少内存)。如果年轻一代足够大,创建500mb的数据甚至可能不会触发一个小的gc周期。另外,很大程度上取决于您使用的是哪个版本的jdk。

mrphzbgm

mrphzbgm2#

好吧,我现在已经知道如何正确地监视java程序的内存了,我使用了“jconsole”应用程序来监视jvm中分配的堆内存,但是在它从堆栈中释放.poped()内存之前,我似乎需要单击这个“请求垃圾收集”命令,我现在正在寻找一种在java程序中执行“请求垃圾收集”的方法。

相关问题