jvm内存管理 1 内存空间

原创 2012年03月23日 13:31:30

jvm内存空间 可以划分为方法区,堆,本地方法,pc寄存器,以及jvm方法栈 如下图

下面分别介绍这几块内容:

一 jvm方法区

方法区中存放了要加载的类的信息 包括类的名称修饰符等,类中的静态变量、类中定义为final类型的常量,类中的field信息,类中的方法信息 当程序调用getName isInterface方法获取信息时这些属于都是源自于该方法区。方法区域也是全局共享的,在一定条件下会被gc 当该方法区超过运行的大小时会抛出OutOfMemory的错误信息。

在sun的jdk中该区对应的permanet generation 又称为持久代 默认最小为16mb 最大为64mb 可以通过 -XX:permSize以及-XX:MaxPerSize 来指定最小值和最大值

二 jvm 堆

堆是用来存储对象实例和数组值,可以认为是java中所有通过new创建的对象的内存都在此分配 heap中对象所占用的内存由gc回收 在32位操作系统上最大为2G 64位上则没有限制。其大小可以通过-Xms和-Xmx来控制。 当默认堆内存空间小于40%时,jvm会增大堆内存到-xmx的大小,通过指定 -xx:minHeapFreeRatio可以来自己设定比例,当空余堆大于70%

时jvm会减小堆的大小到-xms指定的大小,可以通过-xx:MaxHeapFreeRatio来指定这个比例。对于系统运行而言,为了避免在运行过程中频繁调整heap的大小,通常将-Xms和zxmx的值设置为一样。

为了提高内存管理 jvm内存堆又进行了分代管理

分为:1 新生代 2 旧生代

1 新生代 大多是情况下java中程序新建对象都是从新生代中分配内存,新生代是有eden space和两块大小相同的survivor space s0 和s1 可以通过-xmn参数来指定新生代的大小。

可以通过-xx:survivorratio 来调整eden space和surviror space的大小,不同的gc 的分配方式不同,也有些gc会动态调整eden space和s0 s1的大小。

2 旧生代

用于存放新生代中经过多次垃圾回收仍然存活的对象,例如缓存对象,新建对象也有可能在旧生代中直接分配内存,主要情况有两种:

一种是大对象,可以再启动参数上设子-xx:pretenureSizeThreshold=1024(单位是字节)来代表当前对象超过多大时就直接在旧生代直接分配内存,此参数在新生代采用paralel scavenge gc时无效,parallel scavenge gc 会根据运行状况来决定什么对象直接在旧生代上分配内存

另外一种是数组对象 且数组中无引用外部对象

三 本地方法栈

本地方法栈用于支持native运行,存储了每个navigate方法的调用状态,在sun jdk的视线中本地房发展和jvm方法栈是同一个栈区。

四 pc寄存器和jvm方法栈

每个线程中均会创建pc寄存器和jvm方法栈 pc寄存器占用的可能是cpu寄存器或操作系统内存,jvm方法栈占用的是操作系统内存,jvm方法栈为线程私有,其在内存分配上非常高效

当方法运行完毕时,其对应的栈帧所占用的内存也会自动释放。 当jvm方法栈空间不足时会抛出StackOverflowError错误,在sun的jdk中可以通过-xss来指定其大小

JVM 内存空间分为几部分

内存空间分几部分:代码段、数据段,栈,堆 (收集整理) 1.函数代码存放在代码段。声明的类如果从未使用,则在编译时,会优化掉,其成员函数不占代码段空间。 全局变量或静态变量,放在数据段, 局部变...
  • u014421556
  • u014421556
  • 2016年09月01日 10:33
  • 2965

jvm的内存空间分块情况

在方法(代码块)中定义一个变量时,java就在栈中为这个变量分配JVM内存空间,当超过变量的作用域后,java会自动释放掉为该变量所分配的JVM内存空间;而在堆中分配的JVM内存由java虚拟机的自动...
  • u010363836
  • u010363836
  • 2016年04月07日 12:37
  • 1241

实例变量和类变量内存分配

Java向程序员许下一个承诺:无需关心内存回收,java提供了优秀的垃圾回收机制来回收已经分配的内存。大部分开发者肆无忌惮的挥霍着java程序的内存分配,从而造成java程序的运行效率低下! java...
  • u012036927
  • u012036927
  • 2013年11月03日 12:54
  • 1086

JVM内存空间管理

JVM内存空间管理 根据JVM规范,JVM把内存划分了如下几个区域: 1. 方法区2. 堆区3. 本地方法栈4. 虚拟机栈5. 程序计数器 其中,方法区和堆是所有线程共享的。   1 方...
  • hpp1314520
  • hpp1314520
  • 2017年05月24日 16:58
  • 180

JVM内存空间学习

Java运行时内存分配图:(出自深入理解Java虚拟机) 我们常用的主要是: 方法区:存储类信息数据、静态方法、静态量、还有常量池。 堆:存放对象实例。 虚拟机栈(线程私有):存储局部变量表、操作...
  • crazy_kou
  • crazy_kou
  • 2015年07月28日 15:04
  • 297

JVM常见面试题

1. 内存模型以及分区,需要详细到每个区放什么。 栈区: 栈分为java虚拟机栈和本地方法栈   重点是Java虚拟机栈,它是线程私有的,生命周期与线程相同。 每个方法执行都会创建一个栈帧,...
  • sunsfan
  • sunsfan
  • 2016年10月24日 09:47
  • 4784

JVM解读(一):JVM体系结构

JVM全称是java Virtual Machine(java虚拟机),通过模拟一个计算机来完成一个计算机具有的功能 JVM屏蔽了与各个计算机平台相关的软件和硬件差异,所以JVM能够跨计算机体系结构来...
  • uxiaolang
  • uxiaolang
  • 2015年06月26日 16:06
  • 2727

最简单例子图解JVM内存分配和回收

JVM采用分代垃圾回收。在JVM的内存空间中把堆空间分为年老代和年轻代。将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象。年轻代中又被分为Eden...
  • Mr__fang
  • Mr__fang
  • 2014年07月25日 17:33
  • 697

Java虚拟机JVM对自己的内存空间划分

JVM内存模型划分的五个区域: 一:寄存器 , 二:本地方法栈 , 三:方法区 , 四:JVM栈 , 五:堆....
  • Byte_Dance
  • Byte_Dance
  • 2017年12月02日 22:10
  • 31

细说JVM系列:JVM内存空间分区

java虚拟机基本结构:JVM是一个内存中的虚拟机,那它的存储就是内存了,我们写的所有类、常量、变量、方法都在内存中,因此明白java虚拟机的内存分配非常重要,本部分主要讲解java虚拟机内存分配。本...
  • a910626
  • a910626
  • 2016年08月25日 21:31
  • 986
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jvm内存管理 1 内存空间
举报原因:
原因补充:

(最多只允许输入30个字)