回答
堆栈和堆是由操作系统,在 系统运行的JVM分配的回忆。 堆栈是存储方法和局部变量的内存位置。 (可变引用原语或对象引用也存储在堆栈中)。 堆是存储对象及其实例变量的存储位置。
所以要概括:
- 类对象的方法,包括代码和静态字段:堆。
- 对象,包括实例字段:堆。
- 局部变量和调用方法:堆栈
另外,我们有多个线程不同的实例变量?
每个线程都有一个程序计数器(PC)和一个java堆栈。 PC将使用java堆栈来存储中间值,动态链接,方法返回值和调度异常。这用于寄存器的地方。
对于更多关于线程,你真的应该读这个主题Where is Thread Object created? Stack or Heap?。
如果它存储在方法区域中,实例变量如何与 不同?静态变量存储?
正如您在上面看到的静态字段存储在堆中。另一方面,局部变量被存储在堆栈中。
//编辑
据Bruno Reis和Peter Lawrey的意见,你也应该阅读有关逃逸分析
这不是严格正确的。现代JVM更复杂,并且具有优化算法,这些算法可以确定将给定对象存储在*堆栈*上的给定情况下可能导致更好的性能(即,对GC的压力更小)。例如,谷歌JVM逃逸分析。无论如何,除非你写的东西真的很低,否则你不应该在意堆或堆栈中是否存储了某些东西。 –
我不是说这是严格正确的。这只是一个非常简单的视图,变量是如何存储在Java中的。 –
@BrunoReis为真,但逃逸分析很少导致避免使用堆。 –
准确地说,
- 实例变量将存储在堆上。
- 堆栈上的局部变量(在变量不是原始的情况下 [参考变量]参考变量位于堆栈
和堆上的对象)。只有方法调用和部分结果 将被存储在堆栈中,而不是方法本身。 - 方法区的 静态变量和方法(包括静态和非静态)。
参考:头第一个Java
- 1. 存储对象实例在哪里?
- 2. Rails助手模块中的实例变量存储在哪里?
- 3. zend框架中存储的实例化对象在哪里?
- 4. Object中的实例变量在哪里?
- 5. 变量存储在哪里?
- 6. Python中的变量存储在哪里?
- 7. 存储在ggplot2对象中的比例颜色在哪里?
- 8. 对象引用变量(a中)存储在哪里?
- 9. 目的-C:在哪里是对应于存储的一个对象的一个实例变量的指针
- 10. JSFiddle在哪里存储我的变量?
- 11. Java哪里有本地变量,对象引用,实例变量
- 12. 存储在变量栈中的变量在哪里?
- 13. 存储对象的设置在哪里?
- 14. CakePHP存储模型实例在哪里?
- 15. jQuery UI小工具 - 在实例变量中存储jQuery对象
- 16. 存储在内存中的DLL的全局变量在哪里?
- 17. 静态存储在内存中的全局变量在哪里?
- 18. .NET局部变量存储在哪里?
- 19. 挥发性变量存储在哪里?
- 20. FORTRAN在哪里存储局部变量?
- 21. $ _SESSION变量存储在哪里?
- 22. nodejs在哪里存储变量?
- 23. 在哪里存储javascript变量
- 24. selenium webdriver:存储变量在哪里?
- 25. golang环境变量存储在哪里?
- 26. Android:在哪里存储对象
- 27. git存储blob对象在哪里?
- 28. 此管理对象在哪里存储?
- 29. 在哪里存储objectstore和vwsession对象
- 30. const对象存储在哪里
实例变量是每个对象之一。静态变量是每个类的一个。线程(有点)共享相同的内存 –