zoukankan      html  css  js  c++  java
  • JVM内存模型

    JVM的内存划分:

    方法区:是线程共享的,常量静态变量的JIT(即时编译器)编译后代码也在方法区存放。用来存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆得一个逻辑部分,但是他却有个别名Non-Heap(非堆),目的是为了与Java堆区分。方法区用来存放程序中用于不变或唯一的内容(类信息 Class对象、静态变量、字符串常量等)。

    堆内存:线程共享的,垃圾回收的主要场所。Java虚拟机所管理的内存最大的一块,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例(也就是new出来的),几乎所有的对象实例以及数组都在这里分配。Java堆是垃圾收集管理器的主要区域,因此也被称作GC堆。堆是一个不连续的内存空间, 分配灵活,速度慢!

    程序计数器:当前线程执行的字节码的位置指示器。是一块较小的内存空间,可以看做是当前线程所执行的符号指示器。如果正在执行native方法,则这个计数器为空。

    两个主要作用:

    • 字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制,如:顺序执行,选择,循环,异常处理。
    • 在多线程的情况下,程序计数器用于记录当前程序执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行的位置。

    注意:程序计数器是唯一一个不会出现OutOfMemoryError的内存区域,他的生命周期随着现成的创建而创建,随着线程的结束而死亡。

    Java虚拟机(栈内存):保存局部变量,基本数据类型以及堆内存中对象的引用变量。是线程私有的,每个线程都有各自的Java虚拟机栈,并且随着线程的创建而创建,随着线程的死亡而死亡。

    1.栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量,操作数,法出口等)。

    2. JVM 为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)。

    3.栈属于线程私有,不能实现线程间的共享!

    4.栈的存储特性是“先进后出,后进先出”。

    5.栈是由系统自动分配,速度快!栈是一个连续的内存空间!

    Java虚拟机会出现两种异常:StackOverFlowError和OutOfMemeoryError

    • StackOverFlowError的异常:Java虚拟机栈的内存大小不允许动态扩展,当线程请求栈的深度超过当前Java虚拟机栈的最大深度的时候,就会抛出该异常。
    • OutOfMemeoryError的异常:Java虚拟机的内存允许动态扩展,且当线程请求栈内存用完了,无法再动态扩展了,此时会抛出该异常。

    本地方法栈:为JVM提供使用native方法的服务。与虚拟机栈发挥的作用非常相似。区别是虚拟机栈作为虚拟机执行Java方法(也就是字节码文件)的服务,而本地方法栈则为虚拟机使用到的native方法服务。也会抛出StackOverFlowError和OutOfMemeoryError的异常。

       

  • 相关阅读:
    thinkpad--Windows8 F11一键恢复方法
    ThinkPad---Windows8更换Windows7方法
    断网问题360解决方案
    网络故障诊断指南
    重装系统指南
    题目1123:采药
    题目1019:简单计算器
    题目1012:畅通工程
    你的隐私数据真的安全吗之memset()使用分析
    高光谱图像处理深度学习方法综述(一)
  • 原文地址:https://www.cnblogs.com/128-cdy/p/12444251.html
Copyright © 2011-2022 走看看