当前位置: 首页 > 面试题库 >

了解Java内存管理

阮阳曦
2023-03-14
问题内容

Java程序员知道JVM运行垃圾回收器,而System.gc()只是建议JVM运行垃圾回收器。如果我们使用System.gc(),并不一定会立即运行GC。

如果我误解了Java的垃圾收集器,请纠正我。

除了依赖Java的Garbage Collector之外,还有其他方法可以进行内存管理吗?
如果您打算通过某种有助于管理内存的编程实践来回答问题,请这样做。


问题答案:

关于Java内存管理,要记住的最重要的事情是“无效化”您的引用。

仅未引用的对象将被垃圾回收。

例如,以下代码中的对象永远不会被收集,并且您的内存将满,而无所事事。

List objs = new ArrayList();
for (int i = 0; i  < Integer.MAX_VALUE; i++) objs.add(new Object());

但是,如果您不引用那些对象,则可以无限循环,而不会出现内存问题。

List objs = new ArrayList();
for (int i = 0; i  < Integer.MAX_VALUE; i++) new Object();

因此,无论您做什么,都要确保删除对不再使用的对象的引用(将引用设置为null或清除集合)。

垃圾收集器何时运行,最好由JVM决定。好吧,除非您的程序即将开始执行占用大量内存且对速度至关重要的事情,所以您可能建议JVM在进入之前运行GC,因为您可能会收集垃圾并继续使用额外的内存。否则,我个人认为没有理由参加竞选System.gc()

希望对您有所帮助。



 类似资料:
  • 本文向大家介绍简单了解python的内存管理机制,包括了简单了解python的内存管理机制的使用技巧和注意事项,需要的朋友参考一下 Python引入了一个机制:引用计数。 引用计数 python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。 总结一下对象会在

  • 本节介绍内存分析中使用的常用术语,同样适用于其他不同语言的内存分析工具。 这里描述的术语和概念适用于Chrome DevTools堆分析器。如果你曾经使用过Java,.NET,或其他一些内存分析器,那么该篇的内容对你而言就是一次提升。 对象的大小 将内存想象为具有原始类型(如数字和字符串)和对象(关联数组)的图形。它可以在视觉上表示为具有多个相互关联的点图,如下: 对象可以通过两种方式驻留在内存中

  • 问题内容: 我有两个问题: 如果我有对方法的JNI调用而JNI方法泄漏内存该怎么办。此方法完成后,JVM垃圾收集器将能够取回该内存。我听说JVM不管理JNI使用的堆空间吗?但是JNI使用的内存是Java进程使用的内存的一部分吗? 使用JNI来实现IPC是否绝对必要?还有哪些其他流行的Java技术?或者是否有一个开放源代码库来实现Java共享内存? 问题答案: 否:“ JNI框架不为在本机端执行的代

  • 问题内容: 我正在研究真正了解JVM中内存分配的工作方式。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数(例如Xms和Xmx)来增加JVM为正在运行的进程分配的堆空间。这是解决此问题的一种可能的解决方案,或者我可以检查代码是否存在内存泄漏并在那里解决问题。 我的问题是: 1)JVM如何实际为其分配内存?这与OS如何将可用内存传递给JVM有什么关系?或更一般而言,任何进程的

  • 我想真正了解内存分配在JVM中是如何工作的。我正在编写一个内存不足的应用程序:堆空间异常。 我知道我可以传入VM参数,如Xms和Xmx,以增加JVM为正在运行的进程分配的堆空间。这是一个可能的解决方案,或者我可以检查我的代码内存泄漏并修复那里的问题。 我的问题是: 1)JVM实际上如何为自己分配内存?这与OS如何将可用内存传递给JVM有什么关系?或者更一般地说,为任何进程分配内存实际上是如何工作的

  • 对于一个基于图论的框架来说,节点和边是最小的部件。实际应用中,这些部件构成了各种有向图。比如一个有环图,它的数据流动就是一个环形,部件之间的持有关系如果不能很好的处理,那么可能就会存在内存问题。EasyReact 的内存管理逻辑非常简单,也非常精巧。可以让框架使用者无需关注太多的细节即可轻松的使用,而不必担心本框架涉及的内存方面的问题。 中间节点 节点包含了 fork、map、filter、ski