• JVM(一)


    1.程序计数器:是一块比较小的内存空间,他可以看作是当前线程所执行的字节码的行号指示器。

    2.java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一条线程的指令。

    3.java虚拟机栈:与程序计数器一样,java虚拟机栈也是线程私有的,它的生命周期与线程相同。java虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的同时都会创建

                              一个栈帧用于储存局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至完成的过程,就对应的一个栈帧在虚拟机中入栈到出栈的过程。

    4.java虚拟机规范中,对这个区域规定了两种异常状况:

    1.如果线程请求的栈深度,将抛出StackOverflowError

    2.如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError

    5.本地方法栈:与虚拟机栈发挥的作用是非常相似的,他们之间的区别不过是虚拟机栈 虚拟机执行java方法服务,而本地方法栈为虚拟机使用到的Native方法服务。

    6.java堆:java堆是java虚拟机所管理 的内存中最大的一块,java堆是被所有线程所共享的一块内存区域,在虚拟机启动时创建。此内存区域唯一的目的就是存放对象实例

    ,几乎在所有的对象实例都在这里分配内存。

    java堆是垃圾收集器管理的主要区域,因此也被很多时候成为GC堆。从内存回收的角度来看,由于现在收集器基本都采用分代收集算法。所以java堆还可以细分为

    新生代和老年代

    7.方法区与java堆一样,是各个线程所共享的内存你区域,它用于存储已经被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据

    8.对象的访问定位:目前的主流方式使用句柄和直接指针两种。

    通过句柄访问对象:

     

    使用句柄的好处:reference中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而reference本身不需要修改。

    通过直接指针访问:

     

    使用直接指针的对大好处就是速度快,它节省类一次指针定位的时间开销,由于对象的访问在Java中非常频繁,因此这种开销积少成多后也是非常可观的执行成本。

    1. java堆溢出:java堆用于存储对象实例,只要不断的的创建对象并且保证GC roots到对象之间有可达路径来避免垃圾回收机制清楚这些对象,那么这些对象到达最大堆的容量限制后就会产生内存溢出的异常。

    代码展示及异常分析:

     

    上面代码设置java堆的大小为20MB,不可扩展(将堆的最小值与最大值设置为一样的即可自动避免堆自动扩展),通过参数-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存异常时转储快照以便进行异常分析。

    Java堆内存OOM异常是实际应用中最常见的内存溢出异常情况,当出现java堆内存溢出时,异常堆栈信息“java.lang.OutOfMemoryError”会跟着进一步提示”java heap space”

  • 相关阅读:
    linux 文件系统(inode和block)
    vue状态管理vuex从浅入深详细讲解
    小白都能看懂的vue中各种通信传值方式,附带详细代码
    CSS3移动端vw+rem不依赖JS实现响应式布局
    JavaScript原生封装ajax请求和Jquery中的ajax请求
    永久解决Sublime包管理package control 打开install package报错 There are no packages available for installation
    从GitLab上创建分支本地拉取项目和提交项目详解
    前端路由的两种实现方式,内附详细代码
    几个例子理解浅拷贝和深拷贝
    讲解JavaScript中对闭包的理解
  • 原文地址:https://www.cnblogs.com/juddy/p/14216249.html
Copyright © 2020-2023  润新知