【大厂必考之JVM】02,Java面试重点问题

一个毕业后未进大厂的程序员的进阶之路——既为巩固知识,也为交流学习收藏+关注方便观看后续更新。

痴迷技术,热爱分享。个人微信公众号**【一条IT】,免费领取java/python全套学习资料。**

前言

==

本文主要介绍堆内存的结构及对象在堆中的生命周期和垃圾回收。

目录

前言

一、堆的结构

1.1新生区

1.2 养老区

1.3堆结构的代码验证

二、对象的生命周期和垃圾回收

1.对象被回收的流程

2.永久代/元空间

总结


一、堆的结构

===================================================================

  • 新生区:新生区分为三部分,一块较大的Eden(伊甸)空间和两块较小的Survivor(幸存者)空间,默认比例为8:1:1。
  • 养老区
  • 永久存储区/元空间:JDK1.8之后元空间替代永久区

新生区和养老区是垃圾回收的主要区域。新生区和养老区的面积比是1:2

逻辑结构

逻辑结构

物理结构

物理结构

1.1新生区


新生成的对象全部优先存放在新生区中,新生区对象朝生夕死,存活率很低,在新生代中,常规应用进行一次垃圾收集一般可以回收70% ~ 95% 的空间,回收效率很高。

1.2 养老区


在新生代中经历了多次(具体看虚拟机配置的阀值)GC后仍然存活下来的对象会进入老年代中。养老区的空间满了之后会进行Full GC,也叫重GC,FGC。老年代中的对象生命周期较长,存活率比较高,在老年代中进行GC的频率相对而言较低,而且回收的速度也比较慢。当FGC之后,养老区依然没有足够的空间,堆内存溢出。OOM:

Exception in thread “main” java.lang.OutOfMemoryError: Java heap space

1.3堆结构的代码验证


首先 idea 进入 Edit configuration -> VM options:

添加:-XX:+PrintGCDetails


/**

 * @Author: 一条IT

 * @Date: 2020/12/6 12:47

 */

public class TestJVM {

    public static void main(String[] args) {

//        jvm分配的最大内存  默认物理内存的1/4

        System.out.println("-Xmx:"+Runtime.getRuntime().maxMemory()/1024/1024+"Mb");

//        jvm分配的初始内存  默认物理内存的1/64

        System.out.println("-Mms:"+Runtime.getRuntime().totalMemory()/1024/1024+"Mb");

    }

} 

输出结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值