java 虚拟机内存模型

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

一、java内存模型

java 虚拟机内存模型_第1张图片

  • 程序计数器
    程序计数器是一块很小的内存空间,由于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基础)