如何理解《Java编程思想-第四版》P23 中,这个变量直接存储“值”,并置于堆栈中,因此更加高效
一句中的 “堆栈” 两字,到底是堆还是栈?情况如下:
class demo {
private int var1; // 字段1
private Integer var2; // 字段2
public static void main(String[] args) {
int var3 = 0; // 变量1
demo obj1 = new demo(); // 实例1
}
}
参考《Java编程思想-第四版》P23 和 《深入理解Java虚拟机:JVM高级特性与最佳实践 第2版》P39-P43,对于该 demo
实例1:存储在堆内存中
变量1:存储在方法栈中
实例1中的字段1:存储在堆中
实例1中的字段2:存储在堆中
如果是存储在堆中的话,何来高效一说?
On ne peut généralement pas dire que tous les types de données de base sont placés sur la pile ! Lorsqu'il y a un type de base dans une instance de classe, le type de base est placé sur le tas !
La mémoire est divisée en tas et en pile, vous le savez déjà.
La mémoire du tas appartient à la JVM et la mémoire de la pile appartient à la méthode. Lorsque la méthode se termine, la mémoire de la pile disparaît.
Lorsque le programme exécute la fonction principale, il existe une mémoire tas et une mémoire de pile principale
int var3 = 0;
Ce var3 est placé dans la mémoire de pile de la fonction principale et est une valeur.
Après cela
demo obj1 = new demo();
Il y a une variable de référence dans la mémoire de pile de la fonction principale, obj1, qui pointe vers la nouvelle instance dans la mémoire du tas.
Regardons cette instance dans la mémoire du tas. Elle comporte 2 champs, tous deux stockés dans le tas.
Lorsque la fonction principale se termine, s'il y a d'autres threads en cours d'exécution, la JVM n'est pas encore terminée. À ce moment, la mémoire de pile de la fonction principale est effacée, var3 n'est plus là et la variable de référence obj1 n'est plus là. plus là, mais le tas L'instance en mémoire existe toujours, et si aucune autre variable de référence ne pointe vers elle, elle sera effacée plus tard.
是翻译错误,原文中用的是pile,即栈,而不是堆栈。以下是原文:
p22, pile fait référence à la pile et tas fait référence au tas