西安网站开发公司有哪家好,手机免费网址,网站制作方案和主要内容,免费公开api接口大全1、dalvik的Heap和Stack
这里说的只是dalvik java部分的内存#xff0c;实际上除了dalvik部分#xff0c;还有native。这个以后再说。 下面针对上面列出的数据类型进行说明#xff0c;只有了解了我们申请的数据在哪里#xff0c;才能更好掌控我们自己的程序。 2、对象实例…1、dalvik的Heap和Stack
这里说的只是dalvik java部分的内存实际上除了dalvik部分还有native。这个以后再说。 下面针对上面列出的数据类型进行说明只有了解了我们申请的数据在哪里才能更好掌控我们自己的程序。 2、对象实例数据 实际上是保存对象实例的属性属性的类型和对象本身的类型标记等但是不保存实例的方法。实例的方法是属于数据指令是保存在Stack里面也就是上面表格里面的类方法。 对象实例在Heap中分配好以后会在stack中保存一个4字节的Heap内存地址用来查找对象的实例。因为在Stack里面会用到Heap的实例特别是调用实例的时候需要传入一个this指针。 3、方法内部变量 类方法的内部变量分为两种情况简单类型保存在Stack中对象类型在Stack中保存地址在Heap 中保存值。 4、非静态方法和静态方法 非静态方法有一个隐含的传入参数这个参数是dalvik虚拟机传进去的这个隐含参数就是对象实例在Stack中的地址指针。因此非静态方法在Stack中的指令代码总是可以找到自己的专用数据在Heap 中的对象属性值。当然非静态方法也必须获得该隐含参数因此非静态方法在调用前必须先new一个对象实例获得Stack中的地址指针否则dalvik虚拟机将无法将隐含参数传给非静态方法。 静态方法没有隐含参数因此也不需要new对象只要class文件被ClassLoader load进入JVM的Stack该静态方法即可被调用。所以我们可以直接使用类名调用类的方法。当然此时静态方法是存取不到Heap 中的对象属性的。 5、静态属性和动态属性 静态属性是保存在Stack中的而不同于动态属性保存在Heap 中。正因为都是在Stack中而Stack中指令和数据都是定长的因此很容易算出偏移量所以类方法(静态和非静态)都可以访问到类的静态属性。也正因为静态属性被保存在Stack中所以具有了全局属性。 6、总结
Java 的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的堆的优势是可以动态地分配内存大小生存期也不必事先告诉编译器因为它是在运行时动态分配内存的Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是由于要在运行时动态分配内存存取速度较慢。“栈的优势是存取速度比堆要快仅次于寄存器栈数据可以共享。但缺点是存在栈中的数据大小与生存期必须是确定的缺乏灵活性。栈中主要存放一些基本类型的变量,int, short, long, byte, float, double, boolean, char和对象句柄。对比上面的解析可以看出其实Java处理Heap和Stack的大致原理跟C是一样的。只是多了一个内存回收机制让程序员不用主动调用delete释放内存。就像在C里面一般使用new申请的内存才会放到堆里面而一般的临时变量都是放到栈里面去。