• Java新手问题 04 虚拟机相关


    关于基本类型和引用类型

    主要是关于:基本类型和引用类型在本质上有什么区别. 
    基本类型主要包括:
    boolean、byte、short、char、int、long、float、double。
    其它所有的类型都属于引用类型。
    

    Question:这两种类型在内存存储上有什么区别

    • 基础类型在声明的同时系统会给予分配内存空间.
    • 引用类型在声明时系统只是分配了引用空间,数据空间没有分配.引用类型变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进行访问。
    • ![内存中两种类型的状态]({{ "/images" | prepend: site.baseurl }}//2017-07-08-java-basic-four-mem-of-primary-ref.png)
    • 如上图所示,基础类型放在栈内存(Stack memory)中,而引用类型是将引用地址放在栈内存中,实际对象放在堆内存(Heap memory)中。

    Question:这两种类型在性能上有什么区别

    这要从堆栈的优势和区别说起:

    • 栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。
    • 而堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
    • 所以性能方面来说,使用基础数据类型肯定会比使用引用数据类型速度快。

    堆相对进程来说是全局的,能够被所有线程访问;而栈是线程局部的,只能本线程访问。打个比方,栈就好比个人小金库,堆就好比国库。你从个人小金库拿钱去花,不需要办什么手续,拿了就花,但是钱数有限;而国库里面的钱虽然很多,但是每次申请花钱要打报告、盖图章、办 N 多手续,耗时又费力。
      同样道理,由于堆是所有线程共有的,从堆里面申请内存要进行相关的加锁操作,因此申请堆内存的复杂度和时间开销比栈要大很多;从栈里面申请内存,虽然又简单又快,但是栈的大小有限,分配不了太多内存。

    Question:这两种类型对于 GC有什么区别

    • 基本类型的数据是可以共享的,所以整个jvm可能会只有一个基础类型,回收相对较快也较容易.

    参考网址

  • 相关阅读:
    050819no JLINK device found
    050819流水账
    C语言附录的一些小摘要
    020819存疑点&error&warning
    020819流水账
    010819流水账
    310719存疑点&error&warning
    310719流水账
    300719流水账
    linux内核获取当前进程路径分析
  • 原文地址:https://www.cnblogs.com/alcc/p/9201913.html
Copyright © 2020-2023  润新知