java 基本数据类型各种情况下在内存中存储位置?
黄舟
黄舟 2017-04-18 10:52:21
0
4
578

问题:

如何理解《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:存储在堆中

如果是存储在堆中的话,何来高效一说?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

répondre à tous(4)
PHPzhong

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 !

Ty80

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,即栈,而不是堆栈。以下是原文:

Cas particulier : les types primitifs

Un groupe de types, que vous utiliserez assez souvent dans votre programmation, bénéficie d'un traitement spécial. Vous pouvez les considérer comme des types « primitifs ». La raison de ce traitement spécial est que créer un objet avec new (en particulier une petite variable simple) n'est pas très efficace, car new place les objets sur le tas. Pour ces types, Java s'appuie sur l'approche adoptée par C et C++. Autrement dit, au lieu de créer la variable en utilisant new, une variable « automatique » est créée qui n'est pas une référence. La variable contient la valeur directement, et elle est placée sur la pile, donc c'est beaucoup plus efficace.

巴扎黑

p22, pile fait référence à la pile et tas fait référence au tas

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal