java - 是否可以不安全地访问 JVM 未使用的对象?

标签 java scala garbage-collection jvm

我有一个问题要问这里的 JVM 内部专家。

在 Java 虚拟机中,对象内容存储在堆内存中,直到它们被垃圾收集。通常,GC 在没有更多可用内存时发生,因此如果 JVM 有大量可用空间,则可能需要很长时间才能发生 GC。

从安全的角度来看,您能想象出一种方法可以让某人访问 JVM 内存并获取堆空间的转储,从而可以在其中找到等待 GC 的未使用对象吗?

我的意思是:如果我的程序处理敏感数据,并且我以一种在执行涉及这些敏感对象的过程后不会留下对这些敏感对象的引用的方式编写我的应用程序,那么恶意软件或系统管理员是否可以访问堆空间并对其进行分析以找到这些敏感数据?

在内存管理和垃圾收集方面,使用 Scala 有什么改变吗?

最佳答案

系统管理员当然可以访问 JVM 内存。作为最后的资源,他/她可以转储 JVM 进程内存并检查它。事实上,您必须信任您将在其上执行的平台。

您可以通过在 String(不可变的)上使用 char[] 并用在离开您定义它们的范围之前为零,但会有一个时间跨度,在这个时间跨度中,此类数据以明文形式提供。

在较低级别,您可以加密内存,这仍会在某处留下未加密的 key 。您还可以防止内存页面被交换,这无论如何都不会阻止转储,并且如果您的应用程序使用了 RAM 的相关部分并且系统并未完全用于它,则可能会对性能造成不良影响。无论如何,这些解决方案只能保护静态数据,据我所知,没有 JVM 实现它们。

使用 Scala 不会有太大变化,因为这是 JVM 特定的问题,与编译成字节码的源语言无关。

关于java - 是否可以不安全地访问 JVM 未使用的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21700603/

相关文章:

scala - 名为 Scala 自类型仍然阴影 "this"?

garbage-collection - 在 GC 语言中是否有关于(或更好地使用)RAII 的研究?

java - 如何为具有 22G 堆的服务器正确设置 G1GC 选项

java - JasperReports - JSON 数据报告在 Java 中运行时显示空值

java - 如何使用 Play! 访问开发数据库框架?

java - Libgdx firebase robovm 绑定(bind)

java - 使用 sbt 解决 Spark 依赖关系

scala - 通过 sbt 添加 Joda-Time 时出现编译错误,但如果我通过 ide 添加它则运行正常?

c# - 在一段代码中暂停 GC

java - 如何修复错误 "reading .m2\repository\junit\junit\4.8.2\junit-4.8.2.jar"并使用 Java 6 进行编译?