【问题标题】:Do java objects get removed when a java application closes?java 应用程序关闭时是否会删除 java 对象?
【发布时间】:2014-04-11 20:12:14
【问题描述】:

我一直在学习 Java 以及它如何使用垃圾收集与手动释放对象。当java应用程序关闭时,我找不到java对象是否被删除的答案?例如,当一个带有对象的小型控制台应用程序时,JVM 中究竟发生了什么

public class Hello {
    public String name = "Y_Y"; 
}

存在于内存中且控制台应用程序已关闭?

谢谢, Y_Y

【问题讨论】:

  • 它可能不会被清除,但内存空间可供任何其他程序使用并覆盖持有该 Java 对象的任何地址。
  • 当您说“它可能不会被清除”时,是不是意味着它有时会被清除?当堆满时会发生这种情况还是随机的?
  • 通过cleared,我的意思是如果那个内存位置有一个值,那个值可能没有被改变或设置为0。它仍然有它的值Java 进程何时运行。
  • 它将是freed,用 C 语言,正如 @SotiriosDelimanolis 正确指出的那样,并不总是意味着将内存设置为 0。
  • 没有遥控器的电视示例。

标签: java jvm


【解决方案1】:

当应用程序关闭时,jvm 停止运行并将其所有内存返回给主机。

出于所有实际目的,堆和分配在那里的所有对象都停止存在。

如果您担心安全性,任何具有提升权限的进程都可以扫描该内存并读取周围的任何内容。在将内存分配给另一个进程之前,它必须这样做。但这也可能在原始程序/jvm 运行时发生。

【讨论】:

  • 有趣。我可以问很多关于安全的问题,但我对你的回答很满意。有点让我想起十六进制编辑器程序。非常感谢您的快速响应。
【解决方案2】:

你无法确定。该行为未指定或保证。但你不应该太在意这一点。你应该关心的是内存被回收了。

如果安全是您的问题,那么它不应该是。遇到安全案例时应予以处理。用 0 或垃圾重写整个内存会使退出非常慢。

字符串占用的内存在退出时被释放。 如果对象实现了 finalize() 方法,它可以被调用。

另外,您可以使用 System.gc(); 手动调用垃圾收集器

以下是 Sun 规范的摘录。

Java 平台规范很少承诺 垃圾收集实际上是如何工作的。这是Java虚拟 机器规范 (JVMS) 不得不谈到内存管理。

堆是在虚拟机启动时创建的。堆存储 对象由自动存储管理系统(已知 作为垃圾收集器);对象永远不会被显式释放。这 Java 虚拟机假定没有特定类型的自动存储 管理系统,可选择存储管理技术 根据实施者的系统要求。1 虽然看起来 令人困惑的是,垃圾收集模型并不严格 定义其实很重要也很有用——一个严格定义的垃圾 收集模型可能无法在所有平台上实现。 同样,它可能会排除有用的优化并损害 平台的长期性能。

虽然没有一个地方包含完整的定义 所需的垃圾收集器行为,大部分 GC 模型是 通过 Java 语言中的多个部分隐式指定 规范和 JVMS。虽然不能保证确切的 遵循流程,所有兼容的虚拟机共享基本的 本章描述的对象生命周期。

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 2021-03-26
    • 2013-10-18
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多