b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

jvm的垃圾回收器的作用及解决办法(上)(2)

电脑杂谈  发布时间:2021-05-15 23:04:08  来源:网络整理

实际上,如果要估算,可以将以前的计算结果扩展10到20倍。换句话说,除了在内存中创建的付款订单对象外,每秒还会创建许多其他对象。那么每秒创建的堆栈存储器的局部变量所引用的对象的存储空间在几百KB〜1MB之间。

实际上,在清楚地分析了支付系统的核心业务流程之后,每个人都清楚地知道在部署和启动这种系统的每台计算机时应如何设置jvm的堆内存。一般来说,这种商务系统,通用的机器配置是2核4G或4核8G。如果我们使用2核4G机器进行部署,则实际上有点紧凑,因为该机器具有4G内存,但是该机器本身也需要一些内存空间,最后您的jvm进程最多为2G内存。然后,必须将2G内存分配给方法区域,堆栈内存和堆内存。那么堆内存最多可能超过1G的内存空间。

然后,堆内存也分为新一代和旧世代。您的老一辈总是需要放置系统中一些长期存在的对象。您如何才能提供数百​​MB的内存空间,那么新一代的RAM也可能是数百MB。在这种情况下,我们上面的核心业务流程仅针对付款订单对象进行了分析,但是实际上,如果将其扩展10到20倍并替换为整个系统的估算值,我们可以看到它几乎是每一个第二个占用大约1MB的内存空间。因此,如果您的新生代具有数百MB的存储空间,它会在运行几百秒后导致新生代的存储空间已满吗?此时是否有必要触发次要GC?

如此频繁地触发次要GC将影响系统的性能稳定性。具体原因将在后面讨论。因此,您可以考虑使用4核8G机器来部署您的系统,然后您的jvm进程至少可以提供4G以上的内存,而新一代可以分配至少2G的内存空间,从而可以实现即使是新一代,每秒也要消耗大约1MB的内存,但是年轻一代触发次要GC大约需要半小时到一个小时,这大大降低了GC的频率。

花栗子:计算机使用4核和8G,然后-Xms和-Xmx设置为3G,从而为整个堆内存提供3G内存空间,而-Xmn设置为2G,这意味着2G内存空间用于新一代。如果您的业务量更大,则不仅可以考虑部署3台计算机,还可以考虑水平部署5台计算机或10台计算机,从而使每台计算机处理更少的请求并减轻对jvm的压力。

在什么情况下,jvm内存中的对象将被回收?

通过先前的学习,我相信每个人都知道我们系统创建的对象首先分配给了年轻一代。当年轻一代被填满时,将触发垃圾回收,并且没有人会引用新一代。回收对象并释放存储空间。因此,让我们看一下它用于回收垃圾对象的规则。

jvm堆dump文件分析_jvm堆内存_jvm堆内存溢出

1、所引用的对象中哪些变量不能被回收?

这个问题很容易解释,一个是在jvm中使用的

确定哪些对象可以回收,哪些对象不能回收。该算法的含义是分析引用该对象的每个对象,然后逐层对其进行判断,以查看是否存在GC根。这句话比较抽象,很难理解。让我们通过示例代码逐步对其进行分析。代码段如下:

public class User {
       public static void main(String[] args) {
              loadDisk();
       }
       public static void loadDisk() {
             Role role = new Role();
       }
}

在上面的代码中,将“ main()”方法的堆栈框架压入堆栈,然后调用“ loadDisk()”方法,将堆栈框架压入堆栈,然后将本地变量“角色”是指堆内存对象中的“角色”实例。假定现在已通过局部变量引用“ Role”实例对象,则一旦新一代几乎已满并且发生垃圾回收,便将分析此“ Role”对象的可及性,并且发现它无法回收。 ,因为它被某人引用,并且被局部变量“ role”引用。

在jvm规范中,

只要一个对象被局部变量引用,就意味着该对象具有GC根并且不能在此时被回收。另一个相对常见的情况实际上类似于以下情况:

public class User {
      private static Role role = new Role();
}

这时,在垃圾回收分析期间,发现此“ Role”对象被User类的静态变量“ role”引用。在jvm规范中,

这时,只要GC根引用了某个对象,该对象就不会被回收。

总结一句话,只要您的对象是

如果引用它们,将不会被回收。

2、 Java中不同的对象引用类型

java中有不同的引用类型,它们是

。让我们使用代码进行演示。

强引号类似于以下代码:

public class User {
      private static Role role = new Role();
}

这是最常见的代码。变量是指对象。只要是强烈引用的类型,该对象就不会在垃圾回收期间被回收。

下一步是软引用,类似于以下代码:

public class User {
      private static  SoftReference role = new SoftReference(new Role());
}

“角色”实例对象包装有“ SoftReference”软引用类型的对象。此时,此“角色”变量对“角色”对象的引用是软引用。在正常情况下,垃圾回收不会回收软引用对象,但是,如果您发现垃圾回收后内存空间仍然不足,并且内存几乎溢出,那么这些软引用对象此时将被回收。它由变量引用,但由于它是软引用,因此仍需要回收。使用场景:当有足够的内存来提高速度时进行缓存,而当内存不足时JVM将自动回收。

接下来是弱引用,类似于以下代码:

public class User {
      private static  WeakReference role = new WeakReference(new Role());
}

此弱引用类似于无引用。如果发生垃圾回收,则将回收该对象。

虚拟参考,由于很少使用,因此暂时被忽略。

这是堆内存介绍的结尾。下一篇文章将介绍垃圾收集算法。


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-375711-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...