JVM中内存初探

看了几篇博客后,大概对JVM内存的全貌有了基本的认识。3篇参考博客是:《JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )》,《JVM的新生代、老年代、MinorGC、MajorGC》,《JVM的内存配置参数》。以下内容多数也只是对参考博客的粘贴复制。

一、堆(heap),栈(stack),方法区(method)

JVM的内存可以分为3个区:堆、栈、方法区。

  • 方法区: 又叫静态区,是线程共享的,包含所有的class和static变量。这两种变量的特点就是在整个程序的运行期,他们都是唯一的。
  • 堆区:存储的全是对象(不是引用,是实例本身);整个jvm中只有一个堆区(heap),因此是线程共享的。
  • 栈区:
  1.  每个线程包含一个栈区,栈中只保存基础数据类型的变量和对象的引用。
  2.  每个栈中的数据都是私有的,其他栈不能访问。
  3.  栈分为3个部分:变量区、执行环境上下文、操作指令区(存放操作指令)。 (main()方法就对应于主线程,在该线程里面调用一个方法,就往他的栈区里面压入一帧,帧中存放了方法的执行上下文)

二、堆(heap)的再划分

 由于程序中所有的对象都放在堆区,所以需要对堆区进行科学管理。垃圾回收(GC)指的就是堆区内存空间的回收。

图像摘自《JVM的新生代、老年代、MinorGC、MajorGC》
图像摘自《 JVM的新生代、老年代、MinorGC、MajorGC

 

  • 新生代:存放新生的对象。一般占据堆的1/3空间。由于程序运行过程中会频繁创建对象,所以新生代会频繁出发MinorGC进行垃圾回收。新生代又分为:Eden区、2个Survivor区(From区,To区)
  1. Eden区:Java新对象的出生地(如果新创的对象占用内存很大,则直接分配到老年代)。当Eden区内存不够时就会触发MinorGC,对新生代区进行一次垃圾回收。
  2. MinorGC:采用复制算法。首先将Eden区和SurvivorFrom区中的存活对象复制到SurvivorTo区(如果有对象的年龄达到了老年的标准,直接复制到老年代),同时把这些对象的年龄+1;然后清空Eden区和SurvivorFrom区,这时候再把SurvivorTo中的数据复制回SurvivorFrom区中。
  3. 所以,SurvivorTo保存着一次GC过后的幸存者,SurvivorFrom中保存着SurvivorTo中的对象,作为下一次GC的被扫描者。
  • 老年代:老年代对象比较稳定, MajorGC不会频繁执行。在进行MajorGC前先进一次MinorGC,好让新生代的一部分对象晋升为老年代,集中处理。另外,当无法找到足够大的连续空间分配给新创建的较大对象时也会提前触发一次MajorGC进行垃圾回收,腾出空间。MajorGC采用标记-清除算法:首先扫描一次所有老年代,标记出存活的对象,然后回收没有标记的对象。当老年代也装不下的时候,就会抛出OOM (Out of Memory)异常。
  • 永久代:Java 8已经将永久代移除了。永久代没有GC,里面的内容是永久保存的,主要存放Class和Meta(元数据)的信息,Class在被加载的时候放入永久区域。Java 8使用“元数据区”(元空间)来取代永久代。元空间和永久代的最大区别在于:元空间不在虚拟机中,使用的是本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。类的元数据放入native memory,字符串池和类的静态变量放入java堆中,这样可以加在多少类的元数据不再由maxPermSize控制,而由系统实际可用空间来控制。

三、JVM内存配置参数

  • -Xms,指定jvm的heap大小的下限,如:-Xms=2g
  • -Xmx,指定jvm的heap大小的上限,一般上限和下限设为一样的
  • -Xmn,指定新生代的内存大小,-Xms/-Xmx指定的heap大小=(新生代+老年代)
  • -XX:SurvivorRatio=,指定Eden区和Survivor区的大小比例

例题:JVM内存配置参数:-Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3。他的最小内存值和Survivor区总大小分别是10240m和2048m,-XXSurvivorRatio定义的比例是Eden区和一个Survivor区的大小比例,新生代中有两个Survivor区。设一个Survivor 区的大小是x,那么就有3x+x+x = 5120m,得到x = 1024m,2x = 2048m。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值