Java jvm对静态变量的需求及其开销

Java jvm对静态变量的需求及其开销,java,interface,jvm,static-members,Java,Interface,Jvm,Static Members,根据关于静态成员的概念,当对其类进行第一次调用时,会将静态成员创建/加载到内存中。它们在该类的所有实例中都很常见。意味着它们不会被重新创建或重新初始化等。此外,它们只能通过类名访问。不需要为该类创建对象来访问它们 现在我的问题是, 静态成员是否在 内存,直到应用程序启动 跑步即使所有的实例 那个班的学生都是由 垃圾收集器 对于一个大项目,8-10个团队 他们在一起工作,他们不在乎 关于其他团队的编码。 它们可以创建静态成员作为 根据他们的需要。如果所有成员 都缓存在内存中,不是吗 在JVM上创建

根据关于静态成员的概念,当对其类进行第一次调用时,会将静态成员创建/加载到内存中。它们在该类的所有实例中都很常见。意味着它们不会被重新创建或重新初始化等。此外,它们只能通过类名访问。不需要为该类创建对象来访问它们

现在我的问题是,

  • 静态成员是否在 内存,直到应用程序启动 跑步即使所有的实例 那个班的学生都是由 垃圾收集器
  • 对于一个大项目,8-10个团队 他们在一起工作,他们不在乎 关于其他团队的编码。 它们可以创建静态成员作为 根据他们的需要。如果所有成员 都缓存在内存中,不是吗 在JVM上创建开销
  • 默认情况下,接口的所有成员都是静态的,并且在许多情况下接口的使用都很好。但是如果我记住了我的上述问题,我还应该使用接口吗
  • 1) 静态成员只有在定义它们的类本身被收集时才会被垃圾收集;这反过来只能在收集定义类加载器时发生。这在web应用程序容器和插件体系结构中很常见

    2) 是的,定义大量静态数据可能是个坏主意。但它和其他很多东西一样:如果你需要它,它是好的;如果你滥用它,它是坏的。只要运用常识

    3) 同样,定义一个由一千个字符串组成的数组的接口是个坏主意,但人们通常不会这么做。只要运用常识。一般来说,没有(与内存相关的)理由避免使用静态变量

  • 对。没有GC会清理静态变量。这很重要,因为否则就不能依赖静态变量中存储的值。像“Singleton”这样的设计模式依赖于静态变量

  • 静态变量占用的内存与实例变量中存储的相同值一样多,因此,只要变量中存储的值对于应用程序来说确实是必要的,静态变量中就没有特定的存储开销。但是,当涉及到线程安全等问题时,静态变量的使用所带来的副作用需要比内存问题更多地考虑

  • 对。但接口是用来描述功能提供者和用户之间的契约,而不是用来存储任何数据

  • 不,它们是随班收集的

  • 开销与什么相比?替代方案是什么

  • 是的,但是没有人说你必须用静态成员填充它们


  • 过早优化是编程中所有邪恶(或至少大部分邪恶)的根源。
    ——Donald Knuthth这是以假乱真的例子。在我的整个职业生涯中,我总是遇到由于非静态成员被泄漏而导致的内存泄漏。虽然问题中提到的这些问题可能是正确的,但它们很难成为JVM负载的原因。继续说下去,我的猜测是,当一切都说了算,你会希望你在代码可读性、可重用性和可重用性方面投入更多的时间和精力,高内聚和低耦合比担心变量占用的细节更重要。如果你担心你的大项目会因为代码中出现太多的静态变量而陷入麻烦,试着鼓励单元测试。静态变量使单元测试变得困难,所以除非真的需要,否则开发人员希望在没有静态变量的情况下设计代码。+1对于这个非常好的建议。嘿,欧内斯特,你是一个牧场主吗?只是好奇你是不是那个。。。。我喜欢你在那里的帖子,你也曾多次帮助过我。重要的是:1)在应用程序的生命周期内不会发生,但只有当企业应用程序停止并重新部署到应用程序服务器上时才会发生。@Adeel Ansari:是的,就是我。我也认出了你的名字。很高兴在这里见到你@欧内斯特:很高兴听到你也认出了我的名字。顺便说一句,2个月内跑完10公里,哇!继续…@articlestack:我不知道如何温和地说,所以:我是对的,他是错的:)Java中唯一的类实际上不仅仅是由类名定义的,而是由[class,classloader]对定义的。同一类文件可以加载到多个类加载器中。因此,“独生子女”实际上可以存在多次。如果没有代码可以访问其中的一个副本,也就是说,如果没有线程堆栈包含对从该类加载器加载的类创建的任何对象的引用,那么这些副本中的一个可以被垃圾收集。在这种情况下,由于运行代码永远无法访问该单例实例,因此可以将其丢弃。1)接口还存储“最终静态公共”变量的数据,2)请将您的点(1)与@Ernest点(1)开销进行比较,而不是什么都没有。如果某件事没有产生好的结果,人们就会发明新的东西。它们不会停止,因为不存在alternative@articlestack:“开销与零相比”毫无意义。这些变量要么是必需的,要么不是。如果不需要它们,就不要创建它们。对于这个问题,我不知道你的第二句和第三句是什么意思。我认为纯抽象类可以作为接口的替代。(我知道它的缺点,就像一个类只能继承一个类,但可以实现多个接口。)@articlestack当然这是一个替代方案,但开销是相同的。