java方法占用内存的疑惑

Student实体类里面有int、String等变量,创建1000个该对象程序运行所占用内存肯定也变大。如果在该类里面声明一个方法,内存是否也会随着对象创建数目变大而变大(抛开变量的因素)?如果将该方法声明为static呢?

public class Student {
public String name;
public int age;
public String address;
public int level;
public String remark;

public String getMsg() {
    if (age > 0) {
        if (level > 0) {
            return "abc" + address;
        } else {
            return "bcd" + remark;
        }
    } else {
        if (level > 0) {
            return "we" + remark;
        } else {
            return "ewt" + address;
        }
    }
}

}

5个回答

感觉楼上Tiger_Zhao 的回答还不错,其他的回答的有点不沾边啊
是这样的,
Student实体类里面有int、String等变量,创建1000个该对象程序运行所占用内存肯定也变大。 这句是对的,

如果在该类里面声明一个方法,无论你创建多少对象,方法在内存里只有一份,所有对象共享同一方法,所以不存在你说的那种情况。

但是对象的成员变量都是自己私有的,创建的对象越多,内存消耗越多。

至于说static方法,在内存也是只有一份,所有对象共享同一个。

static变量在内存也是只有一份,所有对象共享同一个。

java(不是javascript)其实和C++、VB等一样,都是先编译、再执行的。
方法getMsg()编译后的可执行代码只有1块。
如果创建了两个对象s1、s2,它们内部的“方法表”中都会记下指向可执行代码块的“函数指针”;
至于如何让函数调用的时候能够访问对应对象的成员,其实就是调用时,把 s1 或 s2 作为 this。

你可以简单理解为,方式会自动加上一个参数,按照 getMsg(this) 的定义编译/执行。
静态方法,区别就是不加这个参数,所以和对象实例无关的。

回到内存大小的问题上,无论方法有多复杂(可执行代码块有多大),添加方法只增加保存“函数指针”所需,很小。

首先第一点:内存的大小受服务器配置影响,服务器确定,内存大小是确定不变的!
第二点:对于创建对象,从这个对象被创建,生命周期开始,到这个对象没用,生命周期结束,生命周期一旦结束,就是"垃圾",gc系统会在内存不够的时候,自动回收这些垃圾,从而释放资源,
第三点:如果是静态的,则会一直被加载在内存中,不会被释放,如果静态的方法,变量,类太多,则可能会导致内存溢出.
第四点:如果对于流(各种流),管道(各种管道),如果在操作完成之后,不进行关闭,则会导致这个管道被占用的内存不被释放.gc无法回收,假如内存为5个量,管道占用1个量,如果没有关闭下次再用只有4个量,在没有关闭,只有3个量,如此类推,内容总会被用完,此为内存泄漏,所以对于io操作,需要关闭流

说的问题,应该是从这个对象开始被创建,生命周期开始

方法多关系不大吧,因为方法是要调用才起作用的啊,只有对象被创建了才会占用内存;只是static的是程序被加载的时候就创建了;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问