我一直在探索graalvm,但找不到答案。由于graalvm编译器创建的本机可执行文件可以在任何没有Graalvm或JVM的VM上运行,那么内存管理和GC是如何处理的?graalvm编译器创建的本机可执行文件是否包括内存管理,GC和运行时所需的其他东西?在文档中找不到对此的明确解释
z0qdvdin1#
是的,GC也可以在native-image打包的应用程序中工作。这在文档的Memory Management部分有解释。GC仍然会管理应用程序创建的对象。但是,native-image可能会执行优化,以便在堆栈上分配一些对象,或者在不再需要它们时立即释放它们(如果它能够检测到这一点)。您甚至可以使用native-image的--gc参数选择GC。您可以使用以下GC:
native-image
--gc
*串行GC:此GC占用空间最小,但仅使用单个线程进行垃圾收集,并且在此期间可能会暂停应用程序。它也是具有小堆大小的普通Java应用程序(非本机映像)的默认GC,并且是使用native-image打包的应用程序的默认GC。*G1:G1 GC优化了吞吐量,使用多个线程,暂停时间比串行GC短。它是堆大小不小的普通Java应用程序(非本机映像)的默认GC。此GC仅在使用Oracle GraalVM时可用,不适用于GraalVM Community Edition。****Epperly GC不做任何垃圾收集。如果内存已满,应用程序将崩溃。如果您有不需要任何垃圾收集的小脚本,或者有一个可以定期重启以避免GC暂停或类似情况的实时应用程序,这对于测试可能很有用。
还有一些工作是让ZGC在本机映像上可用。
1条答案
按热度按时间z0qdvdin1#
是的,GC也可以在
native-image
打包的应用程序中工作。这在文档的Memory Management部分有解释。GC仍然会管理应用程序创建的对象。但是,
native-image
可能会执行优化,以便在堆栈上分配一些对象,或者在不再需要它们时立即释放它们(如果它能够检测到这一点)。您甚至可以使用
native-image
的--gc
参数选择GC。您可以使用以下GC:*串行GC:此GC占用空间最小,但仅使用单个线程进行垃圾收集,并且在此期间可能会暂停应用程序。它也是具有小堆大小的普通Java应用程序(非本机映像)的默认GC,并且是使用
native-image
打包的应用程序的默认GC。*G1:G1 GC优化了吞吐量,使用多个线程,暂停时间比串行GC短。它是堆大小不小的普通Java应用程序(非本机映像)的默认GC。此GC仅在使用Oracle GraalVM时可用,不适用于GraalVM Community Edition。
****Epperly GC不做任何垃圾收集。如果内存已满,应用程序将崩溃。如果您有不需要任何垃圾收集的小脚本,或者有一个可以定期重启以避免GC暂停或类似情况的实时应用程序,这对于测试可能很有用。
还有一些工作是让ZGC在本机映像上可用。