了解JVM(二)

一、堆与GC的联系

堆还可以继续划分为更小的单位:
新生代(包括伊甸园、存活区、伸缩区)、老年代(老年代、伸缩区)、元空间(包括了伸缩区)
在这里插入图片描述
GC线程会对垃圾进行回收(在对象创建的时候可能会引发GC线程在堆中回收垃圾)

对象创建的过程

当创建一个新对象的时候需要为新对象申请空间,在伊甸园区申请,但是需要判断伊甸园区的空间对否充足,充足则申请成功,如果不充足则触发MinorGC回收不活跃的对象(不经常使用的对象),回收之后再判断伊甸园区空间是否充足?
充足则申请成功,对象也就创建成功;如果依然不充足,则判断存活区空间是否充足:如果存活区充足则将伊甸园区的部分活跃对象移到存活区,伊甸园的空间申请成功;如果存活区的空间不足者判断老年代空间是否充足:充足则将存活区的部分活跃对象移动到老年代,之后将伊甸园区的活跃对象保存到存活区,空间申请成功;如果老年代的空间不足则触发Full GC(MajorGC)对堆区进行完全彻底的垃圾回收,之后再判断老年代的空间知否充足,充足则将存活区的活跃对象移到老年代,再将伊甸园区的活跃对象移到存活区,空间申请成功。如果触发FullGC之后老年代的空间依然不足则会出现OOM(Out Of Memory)错误。
这种活跃对象逐步往上移动的过程叫作对象的晋升,这就是对象的创建与GC的基本关系过程。

在这里插入图片描述
注:方法区的实现是元空间,在jdk1.8之后出现的。之前是使用永久代来实现方法区。永久代是和堆相连的一块区域,容易导致内存溢出(不是数据异常)。在1.8的时候废除了永久代而使用元空间代替,元空间是我们的物理内存实现。

二、JVM堆内存初始化

在Java运行的时候JVM会自动为堆区分配内存空间:最大内存和初始化内存。内存空间就是可以直接使用的内存;最大内存就是初始化的内存加上可伸缩的内存,当初始化内存不够用的时候会往伸缩区开辟空间,但是如果经过GC之后发现内存不紧张了,此时又会将部分内存变为伸缩区眯着眼每次GC之后可能要重新计算堆内存的空间的比例和大小。(自然耗费性能)

package com.CoderLB;

public class Test {
    public static void main(String[] args)  {
        //实例化Runtime类对象
        Runtime r = Runtime.getRuntime();
        System.out.println("最大内存:"+(double)r.maxMemory()/1024/1024/1024);
        System.out.println("初始内存:"+(double)r.totalMemory()/1024/1024/1024);
        }
}

输出:
最大内存:1.5419921875
初始内存:0.10498046875

其实上最大内存默认是物理内存的四分之一,初始化内存默认是物理内存的六十分之一(大概)
如果要避免GC之后要重新计算堆内存空间耗费性能的问题,可以让伸缩区一开始就不要存在,直接让伸缩区所占的空间直接为初始化的内存(不严格情况下)。对内存进行调优。

  • -Xms:初始化内存
  • -Xmx:最大内存

在这里插入图片描述
输出:最大内存:1.9169921875
初始内存:1.9169921875
配置参数的时候每个参数和参数之间不能有空格。一般情况下将初始内存和最大内存配置相等。可以节约资源。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值