精华内容
下载资源
问答
  • java虚拟机内存模型

    2019-01-06 23:08:53
    JVM调优-java虚拟机内存模型及参数设置 java虚拟机内存模型主要包括:程序计数器、虚拟机栈、本地方法栈、java堆、方法区。 1:程序计数器 程序计数器是一块很小的内存,每一个线程都必须用一个独立的程序计数器,...

    JVM调优-java虚拟机内存模型及参数设置
    java虚拟机内存模型主要包括:程序计数器、虚拟机栈、本地方法栈、java堆、方法区。

    1:程序计数器
    程序计数器是一块很小的内存,每一个线程都必须用一个独立的程序计数器,用于记录下一条要运行的指令。各个线程的计数器之间不相互影响,独立工作,是一个线程的私有的内存模型。

    2:java虚拟机栈
    java虚拟机栈也是线程私有的内存空间,它和java程序在同一时间创建,它保存方法的局部变量、部分结果,并参与方法的调用和返回。
    java虚拟机的允许java栈的大小是动态的或者固定的。java虚拟机抛出两个异常:StackOverflowError和OutOfMemoryError。

    参数配置:
    -Xss 设置栈的大小,栈的大小直接决定函数调用的可达深度。

    public class testStack {

    static int count=0;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
    try {
        recursion();
    } catch (Throwable e) {
        // TODO: handle exception
        System.out.println("栈的深度是:"+count);
        e.printStackTrace();
    }
    }
    
    public static void recursion()
    {
        count++;
        recursion();
    }
    

    }
    设置不同的-Xss大小,运行出的深度是不一样的。
    虚拟机栈运行时使用一种叫做栈帧的数据结构保存上下文数据。栈帧存放了方法的局部变量表、操作数栈、动态链接方法和返回地址信息,这就说明方法中参数不同使用的栈空间是不同的。

    3:本地方法栈
    本地方法栈和java栈相似,但它是管理本地方法的调用,本地方法是C实现的。但在sun的hot spot虚拟机中,不区分本地方法和虚拟机栈。同时也抛出两个异常:StackOverflowError和OutOfMemoryError。

    4:java堆
    java堆是java运行时内存最重要的部分,几乎所有的对象和数组都是在堆内存中分配空间。java堆分为新生代和老年代。新生代主要存储刚刚产生的对象,如果对象的生命足够长,就把老年对象移入老年代。
    新生大分为三级:eden(刚出生)、survivor space0(幸存者0)、survivor space1(幸存者1)。

    5:方法区
    方法区也是jvm内存区中非常重要的一块内存区域,它是被jvm所有线程所共享的,方法区主要保存的信息是类的元数据。
    在Hot Spot 虚拟机中,方法区称为永久区。

    堆分配参数总结:

    -Xms:设置java应用程序启动时的初始堆大小
    -Xmx:设置java应用程序能获得的最大堆大小
    -Xss:设置线程栈的大小
    -XX:MinHeapFreeRatio:设置堆空间的最小空间比例。当堆空间的空闲内存小于这个数值时,jvm便会扩展堆空间。
    -XX:MaxHeapFreeRatio:设置堆空间的最大空间比例。当堆空间的空闲内存大于这个数值时,jvm便会缩小堆空间。
    XX:NewSize : 设置新生代的大小
    XX:NewRatio:设置老年代与新生代的比例,即老年代除以新生代大小
    XX:SurviorRatio:新生代中eden区与survivior 区的比例
    -XX:PermSize:设置永久区的大小
    -XX:TargetSurvivorRatio:设置survivior 的使用率。当达到这个空间使用率时,会将对象送入老年代。

    展开全文
  • java 虚拟机内存模型

    2018-05-05 15:18:12
    java虚拟机内存模型是java程序运行的基础,充分的了解虚拟机内存模型可以对jvm进行更深入的调优,可以使相同的配置资源,运行效率最大化。jvm虚拟机将内存数据分为长须计数器、虚拟机栈、本地方法栈、java堆和方法区...

    java虚拟机内存模型是java程序运行的基础,充分的了解虚拟机内存模型可以对jvm进行更深入的调优,可以使相同的配置资源,运行效率最大化。jvm虚拟机将内存数据分为长须计数器、虚拟机栈、本地方法栈、java堆和方法区五个基本的部分。

    一、java内存模型

    在这里插入图片描述

    • 程序计数器
      程序计数器是一块很小的内存空间,由于java是支持线程的语言,当线程数量超过CPU数量时,线程之间很具时间片轮询抢夺CPU资源。对于单核CPU而言,每一时刻只能有一个线程在运行,而其他线程必须被切换出去。为此,每一个线程必须要有一个独立的程序计数器,用于记录下一条要运行的指令,各个线程之间的计数器互不影响,独立工作;是一块线程私有的空间。
    • 虚拟机栈
      java虚拟机栈也是线程私有的内存空间,它和java线程在同一时间创建,它保存方法的局部变量、部分结果、并参与方法的调用和返回。
    • 本地方法栈
      本地方法栈和java虚拟机栈的功能很相似,java虚拟机栈用于管理java函数的调用,而本地方法栈用于管理本地方法的调用。本地方法并不是java实现的,而是使用C实现。
    • java堆
      java堆可以说是java运行时内存中最为重要的部分,几乎所有的对象和数组都是在堆中分配空间的。java堆分为新生代和老年代两个部分,新生代用于存放刚刚产生的对象和年轻得对象,如果对象一直没有被回收,生存的足够长,老年对象就会被移入老年代
    • 方法区(永久代)
      方法区也是jvm内存区中非常重要的一块内存区域,与堆空间类似,它也是被jvm中所有的线程共享。方法区主要保存的信息是类的元数据。方法区中最为重要的是类的类型信息、常量池、域信息、方法信息。类型信息包括类的完整名称、父类的完整名称、类型修饰符合类型的直接接口表;常量池包括这个类的方法名称、返回类型、方法参数、方法修饰符、方法字节码、和域修饰符;方法信息包括方法名称、返回类型、方法参数、方法修饰符、方法字节码、操作数栈和方法帧栈的局部变量区的大小以及异常表。总之,方法区中保存的信息,大部分来自class文件,是java应用程序运行不可少的重要数据。

    jvm内存分配参数

    合理的分配内存,可以使程序的效率更大化,jvm调优方面,一些经常使用的参数还是要记住的。

    • -Xms
      设置java应用程序启动时初始的堆大小
    • -Xmx
      设置java应用程序能获得的最大的堆大小
    • -Xss
      设置线程栈的大小
    • -XX:NewSize
      设置新生代的大小
    • -XX:MaxNewSize
      设置新生代的最大值
    • -Xmn
      设置相中的新生代大小和最大值
    • -XX:NewRatio
      设置老年代与新生代的比例,它等于老年代大小除以新生代大小
    • -XX:MaxPermSize
      设置最大的永久区(方法区)的大小
    • -XX:PermSize
      设置永久区(方法区)的初始值
    展开全文
  • Java虚拟机内存模型

    2018-06-26 10:57:19
    Java虚拟机内存模型使Java程序运行的基础,毕竟所有的程序都需要使用内存,这就需要Java虚拟机专门设计内存使用方式。Java虚拟机在执行Java程序的过程会把它所管理的内存划分为若干个不同的数据区域,这些区域都有...

        Java虚拟机内存模型使Java程序运行的基础,毕竟所有的程序都需要使用内存,这就需要Java虚拟机专门设计内存使用方式。Java虚拟机在执行Java程序的过程会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间。
         Java虚拟机将其内存数据分为程序计数器,虚拟机栈,本地方法栈,Java堆,方法区等五个部分。

        程序计数器用于存放下一条运行的指令。                    
        虚拟机栈和本地方法栈用于存放函数调用信息。

        Java堆用于存放Java程序运行时所需的对象等数据。
        方法区用于存放程序的类单元数据信息。

        线程共享区域:堆内存区,方法区,运行时常量池。
    多线程:当线程数量超过CPU数量时,线程之间会自动根据时间片轮询方式抢夺CPU资源。

     Java虚拟机规范允许Java栈的大小时动态的或者是固定不变的。在Java虚拟机规范中定义了两种异常跟栈空间有关。即StackoverFlowError和OutofMemoryError。如果线程在计算过程中,请求的栈深度大于最大可用的栈深度。则程序运行过程会抛出StackoverFlowError异常。如果Java栈可用动态开展,而在开展栈的过程中没有足够的内存空间来支持栈的发展,则程序运行过程会抛出OutofMemoryError异常。
        Java虚拟机栈内部结构:

                栈帧:保存上下文数据。存放了局部变量表,操作数栈,动态连接方法和返回地址等信息。
           栈帧有三部分组成。即局部变量区,操作数栈和帧数据区。
                局部变量区被定义为一个从0开始的数字数组。byte,short,char在存储前被转化为int,Boolean也被转换为int,0表示false,其他表示true,long和double占两个字长。局部变量区是通过数组下标访问的。
        操作数站也被组织为一个数字数组,但他不是通过数组下标访问的。而是通过pop和push操作。前一个操作push进的数据可用被下一个pop出来使用。

        帧数据区作用:
                解析常量池里面的数据。
              方法执行完后处理方法返回,恢复调用现场。
            方法执行过程中抛出异常时的异常处理。存储在一个异常表。当出现异常时虚拟机查找相应的异常表是否有对应的Catch语句,如果没有就抛出异常终止这个方法调用。
         函数嵌套调用的次数由站的大小决定。栈越大,函数嵌套调用次数越多,对一个函数而言,它的参数越多,内部局部变量越多,他的栈帧越大,其嵌套调用次数会越少。
    展开全文
  • java内存模型JMM java虚拟机内存模型JVM

    java内存模型JMM

     

     

    java虚拟机内存模型JVM

    展开全文
  • JAVA虚拟机内存模型

    2018-06-05 15:05:07
    一、根据《Java 虚拟机规范(Java SE 7版)》规定,Java虚拟机所管理的内存将会包括一下几个运行时数据区域:1. 程序计数器 程序计数器是一块较小的内存空间,当前线程所执行的字节码的行号指示器。字节码解释器工作...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,443
精华内容 3,377
关键字:

java虚拟机内存模型

java 订阅