JVM内存管理

什么是java内存管理?
首先jvm的运行时数据区域可以划分为堆,栈,方法区,程序计数器。栈又分为虚拟机栈和本地方法栈。
虚拟机栈中存放栈帧,每一个栈帧中存有局部变量表,操作数栈,动态连接等信息,java方法从开始到结束代表着栈帧的一次入栈出栈操作。本地方法栈是为native方法服务的。
程序计数器:当前线程执行字节码时的行号指示器。
堆:用来存放数组和实例化的对象。
方法区:用来存储类信息,final常量,static静态变量,即时编译器编译的代码等,其中还包括运行时常量池,用来存放字面量和符号引用。
其中堆内存比较重要,可能发生的问题是内存泄露或者是内存溢出。内存泄漏是指GC没有回收掉废弃对象导致一直占用空间。内存溢出是指堆内存已满。
垃圾回收策略:
引用计数法,可达性分析法。
标记清除算法,标记整理算法,复制算法,分代算法。
永久代的GC主要回收废弃变量和无用的类。
分代的原因是提高GC性能
每一次GC,90%的对象被回收
根据对象寿命可以分为新生代和老年代。新生代表示对象生命周期短,被回收几率高,主要是Minor GC,老年代表示对象寿命周期长,回收几率低。新生态中主要使用复制算法,老年代主要使用标记清除或标记整理算法。
新生代还可以分为Eden和Survivor区域。一块Eden和两块Survivor。复制算法的一种改进。
问题是为何要设置一个eden区域和两个survivor?假如不设置survivor区域,那么eden区域会频繁进行minor GC,如果有对象在15次GC后活下来,就会进入老年代。那也就是说随着时间推移老年代中的对象越来越多,最终导致fullGC,由于fullGC消耗时间长,会导致系统响应速度。所以存在survivor的意义就是减少老年代中的对象,间接减少fullGC的频率。
虚拟机每次使用 Eden 和 其中一块 Survivor。如果这两个区域满了,发送一次MinorGC,那么就会把存活的对象放入第二块Surivior中,当第二块空间不够时,会将对象放入老年代。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值