jvm内存模型及参数

内存模型

JVM

堆,栈,方法区,计数器

  • 线程共享

存放所有对象实例,GC的主要区域,可以分为新生代,老年代,新生代可以分为一个eden,两个survivor空间(from survivor,to survivor),不需要连续内存,使用-XMX和-XMS控制空间最大最小,推荐写一样大,减少堆空间切换过程的消耗

  • 栈(本地方法栈,虚拟机栈) 线程私有

存放局部变量,操作数栈,动态链接,方法出口等信息

  • 方法区(运行时常量池)线程共享

存放类的基本信息,静态变量,常量,即时编译器编译后的代码等

  • 计数器 线程私有

记录正在执行的虚拟机字节码指令的地址,native方法为空

  • GC线程共享

新生代使用复制算法
老年代使用标记-清理或标记-整理算法

  • 内存分配:
  1. 大多数情况,对象直接在新生代的Eden空间分配,当eden空间不够时,发起Minor GC,因为新生代对象存活时间很短所以会频繁发生Minor GC,其执行速度也会比较快。
  2. 大对象会直接分配到老年代中,大对象指需要连续内存空间的对象,如很长的字符串或数组,可以通过指令-XX:PretenureSizeThreshold参数控制大小分界线,老年代会执行Full GC
  3. 经过Minor GC依然存活,且能被Survivor区容纳的对象,会被转移到Survivor区,标记计数器就增加1,默认增加到15时会转移到老年代,可以通过-XX:MaxTenuringThreshold设置。
  4. JVM在执行Minor GC之前,会检查老年代剩余空间>新生代总空间,如果大于那么Minor GC是安全的,如果小于则会查看指令HandlePromotionFailure是否允许担保失败,如果允许则继续检查老年代剩余空间>历次晋升到老年代对象的平均大小,如果大于,则尝试进行Minor GC,如果小于或不允许,则进行一次FULL GC,使老年代清除一次垃圾
  5. 调用System.gc()也会触发Full GC,Full GC后空间仍然不足,则会抛出OutOfMemoryError,调优时,尽量让对象在Minor GC期间被回收,让对象在新生代多存活,不要使用大对象
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 6,030评论 2 31
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,708评论 0 7
  • http://www.cnblogs.com/angeldevil/p/3801189.html值得一看 Clas...
    snail_knight阅读 1,471评论 1 0
  • 内存溢出和内存泄漏的区别 内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,...
    Aimerwhy阅读 758评论 0 1
  • 一 、java虚拟机底层结构详解 我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统、存储区域、...
    葡萄喃喃呓语阅读 1,532评论 0 4