我开始使用Resharper,它指示方法可以将设为静态。将几百个方法转换为静态方法会在很长一段时间内增加内存占用量吗?将方法转换为静态方法时的内存使用情况
回答
否 - 更改为静态方法对内存没有影响。
第一次引用类型(无论是静态还是非静态),将初始化任何静态成员并运行静态构造函数。但是,如果您只是考虑将方法从非静态方式切换到静态方式,这将对垃圾回收或总内存占用情况没有影响。
如果将类成员更改为静态成员,则只需要担心内存占用情况发生变化。在这种情况下,一旦类型被访问,静态字段将保持为根,并且不会被GC收集。这通常只在必要时完成,并且通过设计 - 您将会员设置为静态,因为您希望会员持续存在。
从JIT编译器的角度来看,静态方法和实例方法没有区别。他们的机器代码非常相似,它被存储在同一种堆中。唯一的区别是一个实例方法有一个额外的参数。
该方法被调用时需要传递额外的参数。这会花费额外的机器码指令,但并不经常。 CPU寄存器(ECX)经常具有正确的值。如果一个实例方法在x86上有多个参数或在x64上有三个以上参数,则有一个区别,必须在堆栈上传递额外的参数,而不是通过CPU寄存器。一个额外的指令。
最糟糕的情况是,你正在看的不到一纳秒。这将很难衡量,这是微型优化的常见问题。
这可能超出了原始问题的范围,但是在调用静态方法或不调用方法时存储在堆上的内容是什么?它只是方法本身,还是包含方法的类的实例,或者其他什么? 垃圾收集是否收集过这种记忆? – 2010-06-25 18:24:36
在方法调用期间没有任何东西存储在堆上。参数通过CPU寄存器和堆栈传递。什么都不需要收集。 Petzold的书“代码”可能会让你感兴趣。 – 2010-06-25 18:40:37
好吧,这很有道理。所以真的,将我的方法从非静态转换为静态的唯一原因是在没有类实例的情况下访问它们?感谢您的推荐。 – 2010-06-25 18:44:37
- 1. C#类实例的静态方法VS静态类的内存使用情况
- 2. 何时知道将方法转换为静态方法
- 3. 使用静态方法和实例方法的AS3对象内存使用情况
- 4. 将方法转换为通用方法?
- 5. 我是否应该将不使用此方法的方法转换为React中的静态方法?
- 6. 使用方法调用静态方法?
- 7. 将java转换为scala - 重载的静态方法
- 8. 将ActionResult转换为静态方法中的URL字符串
- 9. 将普通方法转换为静态方法有哪些收益?
- 10. 将Java方法转换为Scala方法
- 11. 将C#方法转换为C++方法
- 12. 只用静态方法将程序转换为使用对象的程序
- 13. 便捷方法vs初始化方法的内存使用情况
- 14. 如何在静态方法中将“promises”转换为“string”[ts]
- 15. 内存中的静态方法和实例方法
- 16. 静态方法内存分配
- 17. JavaScript类静态方法内存消耗
- 18. 静态方法内存消耗
- 19. 使用ImageIO静态方法缓存
- 20. 在Dao类中使用静态方法或非静态方法?
- 21. 测量Java程序内存使用情况的最佳方法?
- 22. Java测量内存使用情况的方法如何?
- 23. 跟踪内存使用情况的方法
- 24. 模拟静态使用时的静态方法从其他方法
- 25. 静态内联方法?
- 26. 无法使用GetProcessMemoryInfo测量静态数组的内存使用情况
- 27. 静态方法或使用静态字段的非静态方法
- 28. 静态方法使用
- 29. 尝试将其用作静态方法时未定义方法
- 30. Java错误:静态方法无法引用非静态方法
是否存在存储在任何位置的静态方法的副本?我的假设是,当你引用一个静态方法时,它将被存储在某个地方,然后每个后续引用都会使用该方法的实例,但我知道这个假设可能是错误的。 – 2010-06-25 17:38:09
无论是静态还是实例方法,“方法”在进入进程空间时都会在内存中加载一次,并由JIT编译。静态和非静态方法使用方面确实没有区别。关注静态方法是否适合您的特定情况 - 并用它来确定方法应该是静态方法还是实例方法。 – 2010-06-25 17:40:30
对内存的影响非常小 - 因为会生成额外的代码来将“this”指针传递给不使用它的方法。 – Qwertie 2010-06-25 18:21:32