java之jvm基础知识

1 篇文章 0 订阅
1 篇文章 0 订阅

 JAVA虚拟机的基本机构

 JVM堆空间布局

 首先为什么分代:

1.不同类型对象的生命周期是不一样的;

2.不同年代的对象采取不同的收集方式,以便提高回收效率;

3.如果不分代,每次垃圾回收都需要遍历内存空间,花费时间较长,效率低;

4.如果不分代,多次垃圾回收后,生命周期长的对象仍然存在,效率低;

 年轻代:

1.新生成的对象首先都是分配在年轻代的;

2.年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象;

年轻代的结构:

1.Eden:Eden用来存放JVM刚分配的对象;

2.Survivor1 和Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没
有被回收掉时,会在两个Survivor之间来回 Copy,当满足某个条件,比如Copy次
数,就会被Copy到Tenured;

年轻代内存的设置:

1.SurvivorRatio=eden/from=eden/to 伊甸园 空间和幸存者空间的 比值;
2.NewRatio=tenured/young  老年代内存和年轻代内存比值;

设置策略:

1.尽可能将对象预留在新生代;
2.减少老年代GC 次数;

老年代:

1.在年轻代中经历了N次垃圾回收后仍然存活的对象,就会被放到老年代;

2.老年代中存放的都是一些生命周期较长的对象,例如: Session对象、Socket连
接等;

MaxTenuringThreshold:

1.MaxTenuringThreshold是年轻代和老年代的临界值;

2.MaxTenuringThreshold用于控制对象能经历多少次Minor GC才晋升到老年代;

3.每发生一次Minor GC,年龄就增加1岁,当它的年龄增加到临界值(默认为15
岁),就将会被晋升到老年代中 ;

永久代(持久代)内存:

1.永久代内存用于保存类信息。方法区的大小决定了系统可以保存多少个类;

2.如果定义了太多的类,会导致永久代内存溢出;

3.在JDK1.8中,废弃永久代,取而代之的是元数据区( Metaspace ) ;

直接内存:

1.直接内存常用于使用NIO的场景,例如:mina,netty框架;参考 DirectBufferOOM、
ByteBuffer ;

2.直接内存跳过了java堆,使java程序可以直接访问原生内存空间,因此,直接内存访
问速度会快于堆内存;

3.直接内存适合申请次数较少,访问较频繁的场合。如果内存空间本身需要平衡申请,
则不适合使用直接内存;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值