首先让我们快速回顾一下我作为Java开发人员的职业生涯的早期。 我想消除正在进行的测试中的垃圾回收(GC)暂停。 瞧,当我发现无法完成时,我很生气。 那时,我将问题抛在了“设计错误”上,并继续前进。 对James Gosling或对该决定负责的人感到生气。

几天前,我遇到了一种使我想起过去的时代的情况。 幸运的是,过去的岁月在我体内积累了一些关于JVM内部的见解,我认为我会以博客文章的形式分享我的最新想法。

首先,你们中的某些人可能还记得我们在90年代后期使用的Java 1.1。 那时,您实际上就有可能关闭GC。 至少在Solaris(Sun提供的JVM版本)中,可以在您的JVM启动参数中添加-noasyncgc选项。 在向后兼容JDK 1.4之前,仍然支持该选项,但是从JDK 1.2开始,它什么也没做。 除了增加启动脚本的复杂性。

该选项关闭了JVM控制的垃圾收集器。 您仍然可以通过从代码中显式调用System.gc()来收集未使用的对象。 听起来像经验丰富的工程师可以很好地利用灵活性。 那么–为什么要删除此选项?

实际上,考虑以下因素后,此举背后的动机就变得有意义了:

  • 通过禁用GC,您实际上声称您知道应用程序在运行时需要多少内存。 但是,如果您错了怎么办? 堆填满后,禁用GC将导致应用程序终止。
  • 调用System.gc()可能根本不执行垃圾回收。 在现代JVM中,仅是向JVM建议“我认为这是运行GC的好地方”。 并且–您的sysadmin可能通过指定-XX:+DisableExplicitGC启动参数完全禁用了System.gc()调用。
  • 如果System.gc()实际上是由JVM执行的,则将导致完整的垃圾回收。 对于大堆,这往往非常昂贵,并且会导致较长的暂停时间。
  • 通过调用System.gc()仍然无法实现可预测的GC计时,尤其是在多线程应用程序中。

    现在,看一下以上几点,并想象一个可以在没有自动GC的JVM中运行的应用程序。 您可能不想将房子押在房子的行为上。 当我尝试描绘调试会话以跟踪该应用程序的任何性能问题时,我的后背上的头发立即开始冒起。 所以也许先生。 戈斯林毕竟没有犯过设计错误。

    但是,如果我停下来的停顿时间太长了,该怎么办? 我真的希望关闭GC吗? 实际上有一些可能性:

    • JVM分配了一部分内存,您可以在其中关闭GC。

    但是,我建议您仅在确定要做什么时才转向这些解决方案。 在99.9%的情况下,垃圾收集器会比您更聪明。

    参考: 为什么我不能关闭垃圾收集器? 由我们的JCG合作伙伴 Nikita Salnikov Tarnovski在Plumbr Blog博客上获得。

翻译自: https://www.javacodegeeks.com/2012/12/why-cant-i-turn-off-the-garbage-collector.html

为什么我不能关闭垃圾收集器?相关推荐

  1. 垃圾收集算法,垃圾收集器_为什么我不能关闭垃圾收集器?

    垃圾收集算法,垃圾收集器 让我们开始快速回顾一下我作为Java开发人员的职业生涯的早期. 我想消除正在进行的测试中的垃圾回收(GC)暂停. 瞧,当我发现无法完成时,我很生气. 那时,我把问题留在了&q ...

  2. 《深入理解Java虚拟机》-----第3章 垃圾收集器与内存分配策略

    Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来. 3.1 概述 说起垃圾收集(Garbage Collection,G ...

  3. JVM 调优实战--常见的垃圾回收算法及垃圾收集器组合

    什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出两种 ...

  4. 垃圾收集器与内存分配策略(五)之垃圾日志与常见参数

    2019独角兽企业重金招聘Python工程师标准>>> 垃圾收集器与内存分配策略(五)--垃圾日志与常见参数 理解GC日志 每个收集器的日志格式都可以不一样,但各个每个收集器的日志都 ...

  5. hotspot 垃圾收集器_HotSpot增量Java垃圾收集器

    hotspot 垃圾收集器 在我最近的博客文章" 确定活动的HotSpot垃圾收集器"中 ,我描述了可用于确定HotSpot JVM (Java进程)正在使用的垃圾收集器(当从命令 ...

  6. 垃圾收集算法,垃圾收集器_弱,弱,最弱,利用专家参考来管理垃圾收集器

    垃圾收集算法,垃圾收集器 何时以及何时不使用Java中的专家引用 弱引用,软引用和幻像引用既危险又强大. 如果以错误的方式使用它们,则会破坏JVM性能. 但是,如果使用正确的方法,它们可以大大提高性能 ...

  7. HotSpot增量Java垃圾收集器

    在我最近的博客文章" 确定活动的HotSpot垃圾收集器"中 ,我描述了可用于确定HotSpot JVM (Java进程)正在使用的垃圾收集器(当从命令行参数(标志) 中看不出来) ...

  8. 弱,弱,最弱,利用专业参考来利用垃圾收集器

    何时以及何时不使用Java中的专家引用 弱引用,软引用和幻像引用是危险且强大的. 如果以错误的方式使用它们,则会破坏JVM性能. 但是,如果使用正确的方法,它们可以大大提高性能和程序清晰度. 弱引用和 ...

  9. JVM初探:内存分配、GC原理与垃圾收集器

    JVM内存的分配与回收大致可分为如下4个步骤: 何时分配 -> 怎样分配 -> 何时回收 -> 怎样回收. 除了在概念上可简单认为new时分配外, 我们着重介绍后面的3个步骤: I. ...

最新文章

  1. 那些复杂的技术设计的开始离我们并不遥远
  2. Ubuntu16.04 LTS上安装Go1.10
  3. 面试:知道 CopyOnWriteArrayList 吗?
  4. mysql 视图列信息_MySQL 中获取用户表、用户视图、用户表中列信息
  5. 机器学习入门10 - 正则化:简单性(Regularization for Simplicity)
  6. python selenium T3
  7. imx6 android power off
  8. 什么是pom文件_什么是POM?
  9. 消消乐游戏原理(附部分代码)
  10. 直流侧电力有源滤波器滤除谐波干扰的原理及方案
  11. 【Godot】通过属性检查器显示对应节点的脚本属性
  12. 校园一卡通的实现机制(图解)
  13. (C#)Windows Shell 外壳编程系列总结
  14. 拼团模式--社交电商的常见营销手法
  15. #1024程序员节#活动勋章获取方式
  16. m基于matlab的无线光通信CDMA闭环链路功率控制算法仿真,对比了OOK,2PPM,4PPM,8PPM,16PPM
  17. SMB2协议特性之oplock与lease(下)
  18. Windows:直接使用命令运行一个程序
  19. 华为融合电信云解决方案包括_华为云解决方案.ppt
  20. 四款超好用的甘特图软件

热门文章

  1. java分布式对象(RMI+部署使用RMI的程序)
  2. Comparable and Comparator API
  3. 有序数组中查找第一个比target大的数
  4. throwable_您想了解的所有Throwable
  5. 命名对象实体对象_我的对象命名
  6. rxjava 背压_背压加载文件– RxJava常见问题解答
  7. HTTP方法:幂等性和安全性
  8. 外部集成 网页制作_外部服务的集成测试
  9. 吸气剂和二传手被认为有害
  10. couchbase_Couchbase 101:从Java应用程序创建视图(MapReduce)