4g内存 堆内存分配多少_我需要多少内存

4g内存 堆内存分配多少

什么是保留堆?

我需要多少内存? 在构建解决方案,创建数据结构或选择算法时,您可能会问自己(或其他人)这个问题。 如果此图包含1,000,000条边并且我使用HashMap进行存储,此图是否适合我的3G堆? 构建我的自定义缓存解决方案时,我可以使用标准的Collections API还是它们带来开销过多?

显然,简单问题的答案要复杂一些。 在这篇文章中,我们将对此做一个初步的了解,看看实际上兔子洞有多深。

标题中问题的答案分为几个部分。 首先,我们需要了解您是对浅堆大小还是保留堆大小感兴趣。

浅堆很容易–它仅由对象本身占用的堆组成。 在计算方法上有一些细微差别,但是对于本文的范围,我们将其保留不变。 请继续关注同一主题的未来帖子。

保留的堆在许多方面都更加有趣。 很少有人对浅堆感兴趣,在大多数情况下,您的实际问题可以转换为“如果我从内存中删除此对象,那么垃圾收集器现在可以释放多少内存”。

现在,众所周知,所有Java垃圾回收(GC)算法都遵循以下逻辑:

  1. GC将某些对象视为“重要”对象。 这些被称为GC根,并且(几乎)从不丢弃。 例如,它们是当前正在执行的方法的局部变量和输入参数,应用程序线程,来自本机代码的引用以及类似的“全局”对象。
  2. 从那些GC根目录引用的任何对象均假定为正在使用,因此未被GC丢弃。 一个对象可以用Java中的不同方式引用另一个对象,在最常见的情况下,对象A存储在对象B的字段中。在这种情况下,我们说“ B引用A”。
  3. 重复该过程,直到访问了可以从GC根过渡获取的所有对象并将其标记为“使用中”为止。
  4. 其他所有东西都没有使用,可以扔掉。

现在,为了说明如何计算保留的堆,让我们通过以下示例对象遵循上述算法:

为了简化示例,让我们估计所有对象O1-O4的浅堆为1024B = 1kB。 让我们开始计算这些对象的保留大小。

  • O4没有引用其他对象,因此它的保留大小等于其1kB的浅大小。
  • O3引用了O4。 因此,垃圾收集O3意味着O4也有资格进行垃圾收集,因此我们可以说O3保留的堆为 2kB
  • O2引用了O3。 但是现在需要注意的是,从O2删除指向O3的指针并不能使O3符合GC的条件,因为O1仍然有指向它的指针。 因此, O2保留的堆只有1kB
  • 另一方面,O1是在此小图中保留所有引用的对象,因此,如果我们删除O1,则该图上的所有内容都将被垃圾回收。 因此, O1保留的堆为4kB

实际上有什么影响? 实际上,了解浅堆大小和保留堆大小之间的差异

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值