开发者社区> 问答> 正文

关于java 中的静态方法、静态类有以下问题。

java 中的静态方法、静态类
这应该算是基础问题了,但能答好的估计也不多,特地求教各位大佬。

java 的版本以 jdk8 为准,不说之前的版本。

问题主要有几个:

1、一个普通类中的静态方法,如果不去调用它,这个时候是否已经将相关的代码加载到内存中了,或者这么说,我创建非常非常多的静态方法,是否这些都会在项目一启动就进入到了内存中,导致内存爆炸

2、一个普通类中的静态方法,我调用过后,是否就一直常驻在内存中了?

3、常驻在内存中的到底是什么东西,是变量,还是执行代码之类的什么东西?哪些会影响到内存的占用?

4、针对静态方法(比如常见的工具类)我们应该怎么设计来避免这些问题?

展开
收起
OSC开源社区 2024-05-31 15:50:41 15 0
1 条回答
写回答
取消 提交回答
  • 题主有这方面的想法是好的,但有点想多了。因为代码都需要加载到内存中。

    一个应用程序分配的内存分为四块:代码全局栈与堆。

    java编译成字节码后,你的代码也会被加载到内存中。

    如果声明为static的块则表明这一块是可以由实例或其它静态成员直接访问的。而如果不标记为static则jvm不容许访问,当然也不是绝对的,有方法可以直接访问内存中非static的区域。

    说白了,你的代码在内存看来只是一堆字符串,而static final的值也只是字符串的值而已。如果你用反射的方式所有的都可以读取到。

    static这里可以理解成语法糖,方便你直接修改或读取代码区的内容。

    但是实例成员却无法访问即或在内存的栈或堆中加载。

    每个应用的内存是有限的,你代码全部都设计成static也就是你代码的大小。而一般代码的大小能有多少?一个项目几十万行代码也不过几百兆。全加载也没什么。一般几万行代码的项目则只几十兆到几兆全部加载也没什么。

    你可以这样理解静态方法<= 代码总数。而默认是你的运行代码需要全部加载的。当然如果你使用了第三方的jar包,加载jar有懒加载这时就可以少加载一些代码到内存了。

    其实说到内存的控制,尽量要控制的是数组及结构数量,数组是加载到栈中,而栈只有15-16k。

    而流则多数是以byte[]进行操作的,这时你如果不控制好就容易内存溢出。如一次加载几十MB的文件。而不使用stream也不使用buff。

    2024-05-31 16:41:52
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载