美文网首页
读书笔记:深入理解java虚拟机

读书笔记:深入理解java虚拟机

作者: xlesterx | 来源:发表于2017-08-17 14:08 被阅读7次

    自动内存管理机制

    1. 程序计数器

    • 由于java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一个线程中的指令。因此为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计算器,各条线程之间计算器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

    • 当执行java方法时,计数器记录的是正在执行的虚拟机字节码指令的地址。

    • 当执行native方法,计数器则为undefined。

    2. java虚拟机栈

    • java虚拟栈也是线程私有的,生命周期与线程相同。为java方法服务(也就是字节码)。

    • 虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧。用于存储局部变量表、操作数栈、动态链接、方法出口等信息

    3. 本地方法栈

    • 本地方法栈为虚拟机使用到的native方法服务。

    4. java堆 (-Xmx -Xms)

    • java堆是java虚拟机锁管理的内存中最大的一块。java堆是被所有线程共享的一块内存区域。此内存区域的唯一目的就是存放对象实例。

    5. 方法区

    • 它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
    • 在hotspot虚拟机上开发,使用永久代实现方法区。

    6. 运行时常量池

    • 运行时常量池是方法区的一部分,class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

    7. 直接内存

    • 在jdk1.4中新加入NIO类,引入了一种基于通道与缓存区的I/O方式,它可以使用native函数库直接分配堆外内存,然后通过一个存储在java堆中的FirectByteBuffer对象作为这块内存的引用进行操作。显著提高了性能,因为不用在java堆和native堆中来回复制数据

    HotSpot虚拟机对象

    1.对象的创建

    • 虚拟机遇到一条new指令时, 首先将去检查这个指令的参数是否能在常量池中定位 到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始 化过。如果没有, 那必须先执行相应的类加载过程。
    • 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定。

    相关文章

      网友评论

          本文标题:读书笔记:深入理解java虚拟机

          本文链接:https://www.haomeiwen.com/subject/gcnirxtx.html