Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用静态内存管理是否更好?_Java_Memory Management_Static_Heap Memory_Stack Memory - Fatal编程技术网

Java 使用静态内存管理是否更好?

Java 使用静态内存管理是否更好?,java,memory-management,static,heap-memory,stack-memory,Java,Memory Management,Static,Heap Memory,Stack Memory,在一些关于静态的文章和教程中,比如和,据说使用静态有利于内存管理,因为静态变量在类加载时只在类区域获取一次内存 但我的朋友告诉我,静态方法保存在堆栈中,因为管理堆比管理堆栈容易,垃圾收集器只在堆上工作,只要应用程序正在运行,堆栈就不会被清除,所以尽量少使用静态方法 注: 我在stackoverflow中读到了关于堆栈内存的相同问题,但我没有得到太多,因为它们在使用“PermGen space”和其他我不知道的单词时有多么复杂和专业 我希望有人简单地解释一下我的朋友advance是否正确 我知道这

在一些关于静态的文章和教程中,比如和,据说使用静态有利于内存管理,因为静态变量在类加载时只在类区域获取一次内存

但我的朋友告诉我,静态方法保存在堆栈中,因为管理堆比管理堆栈容易,垃圾收集器只在堆上工作,只要应用程序正在运行,堆栈就不会被清除,所以尽量少使用静态方法

注:

我在stackoverflow中读到了关于堆栈内存的相同问题,但我没有得到太多,因为它们在使用“PermGen space”和其他我不知道的单词时有多么复杂和专业

我希望有人简单地解释一下我的朋友advance是否正确


我知道这取决于,想象一下,我可以使用静态方法或不使用静态方法进行设计。内存管理谈论哪种方法更好?

答案是:问这个问题意味着你把时间和精力花在了错误的地方

获得性能良好的Java应用程序的关键角色是:提出一个优雅的OOP设计,以直接的方式实现您的需求

您必须了解,通过即时编译器的工作,“Java性能魔术”几乎完全发生在运行时。JIT最擅长于那些我们认为是Java中“最佳实践”的常用模式

试图想出“特殊”的想法,比如“让我们到处使用静态”甚至可能最终导致性能下降——因为“特殊”代码阻止JIT以最佳方式完成其工作

因此:分别信任JIT和GC。并确保这些工具能够以“最佳”的方式工作,方法是。。。其他人都在干什么

不要让这种过早优化的想法破坏你的OOP设计。即使您的应用程序属于罕见的类别,需要密集的低级别优化,那么您只有一种方法:深入研究GC和JIT的工作方式

换句话说:这些问题不是真正的问题。意思是:

  • 当然,你可以避免完全愚蠢的错误,但是
  • 否则,您不会担心内存或性能问题,除非您手头有实际问题(例如,应用程序需要太多内存或客户向您投诉)
然后-当您遇到“真正的”问题时:您必须分析应用程序以了解问题的根本原因。再次强调:您不允许这种不成熟(未受过教育)的优化思想以消极的方式影响您的设计


正如评论所暗示的那样,我还不够清楚:当你有真正的记忆问题时,你绝对必须理解像“烫发一代”这样的术语。因为你必须详细了解GC是如何工作的。严肃地说:相信这里的人告诉你的静态关键字在创建“内存高效”应用程序方面没有起到任何重要作用。

答案是:问这个问题意味着你把时间和精力花在了错误的地方

获得性能良好的Java应用程序的关键角色是:提出一个优雅的OOP设计,以直接的方式实现您的需求

您必须了解,通过即时编译器的工作,“Java性能魔术”几乎完全发生在运行时。JIT最擅长于那些我们认为是Java中“最佳实践”的常用模式

试图想出“特殊”的想法,比如“让我们到处使用静态”甚至可能最终导致性能下降——因为“特殊”代码阻止JIT以最佳方式完成其工作

因此:分别信任JIT和GC。并确保这些工具能够以“最佳”的方式工作,方法是。。。其他人都在干什么

不要让这种过早优化的想法破坏你的OOP设计。即使您的应用程序属于罕见的类别,需要密集的低级别优化,那么您只有一种方法:深入研究GC和JIT的工作方式

换句话说:这些问题不是真正的问题。意思是:

  • 当然,你可以避免完全愚蠢的错误,但是
  • 否则,您不会担心内存或性能问题,除非您手头有实际问题(例如,应用程序需要太多内存或客户向您投诉)
然后-当您遇到“真正的”问题时:您必须分析应用程序以了解问题的根本原因。再次强调:您不允许这种不成熟(未受过教育)的优化思想以消极的方式影响您的设计


正如评论所暗示的那样,我还不够清楚:当你有真正的记忆问题时,你绝对必须理解像“烫发一代”这样的术语。因为你必须详细了解GC是如何工作的。严肃地说:相信这里的人告诉你的话,static关键字在创建“内存高效”的应用程序中不起任何重要作用。

当程序第一次运行时,静态变量的内存分配只发生一次。 如果在类中使用它,则只创建一个实例,该实例由类的每个对象共享。 所以内存消耗更少。在java8之前,静态方法和变量都存储在PERMGEN空间中。但是现在他们引入了新的内存空间,称为METASPACE。现在,这里是存储所有类方法、类字段和常量池的地方。 更多
class Sample {
    private static BigThing biggie=new BigThing(10000);
}