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
设置永久区(方法区)的初始值