• 《深入理解JVM虚拟机》读书笔记(未完待续)


    序:

    1.如果开发人员不了解虚拟机的一些技术特性的运行原理,就无法写出最适合虚拟机运行和自优化的代码。

    第一部分:走近JAVA:

    1.虚拟机发展历史

    2.自己编译JDK,断点调试运行程序

    第二部分:自动内存管理机制

    1.程序计数器:字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令(debug时也是靠它)

    2.每个线程都只会执一条线程中的指令,每条线程都需要有一个独立的程序计数器,各条线程之间的计数器互不影响,独立储存,我们称这类内存区域为“线程私有”的内存。

    3.如果线程正在执行的是一个java方法,这个计数器记录的是正在执行的虚拟机字节码指定的地址;如果是native方法,则计数器值为空(undefined)。此内存区域是唯一一个没有内存不够情况的区域。

    4.java中的“栈”,一般指的就是JVM中的Java虚拟机栈,或者说是虚拟机栈中局部变量表部分。每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于储存几部变量表、操作数栈、动态链接、方法出口等信息

    5.局部变量表所需的内存空间在编译期间完成分配,其中64位长度的long和double类型的数据会占用2个局部变量空间(Slot),其余的数据类型只占用一个。

    6.如果现场请求的栈深度大于虚拟机所允许的深度,将抛出stack over flow error 异常(递归调用场景),如果虚拟机栈可以动态扩展(Map),如果扩展时无法申请到足够的内存,就会抛出out of memory error异常

    7.本地方法栈与虚拟机栈的作用是非常相似的,区别是一个执行Java方法,一个执行本地native方法。本地方法栈并没有规定的数据结构和使用语言,由具体的虚拟机自由实现。同样会抛出内存溢出和内存不足的异常

    8.Java堆(Heap)是Java虚拟机所管理的内存中最大的一块。所有的实例和数组都在它上面分配(随着优化技术的提升,这句话并不绝对了)

    9.Java堆可以是物理上不连续的内存空间,也可以扩展。但如果超过上限,还是会报out of memory error。

    10.方法区,被当做堆的一个逻辑部分。用来储存虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。不同的虚拟机有不同的实现

    11.

  • 相关阅读:
    一个简单的瀑布流效果
    C#遇到的一些奇怪问题
    能够按页号提取word文档文本内容的小程序,由C#实现
    设计模式学习之简单工场模式
    设计模式学习之策略模式
    检查机器是否安装了.NET Framework 或已经安装了哪些.net版本
    书籍清单
    使用Func<T>对对象进行排序
    定义一个委托的三种形式
    设计模式学习之设计原则
  • 原文地址:https://www.cnblogs.com/xujanus/p/8513587.html
Copyright © 2020-2023  润新知