Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java可以在没有GC的情况下运行吗_Java_Rust - Fatal编程技术网

Java可以在没有GC的情况下运行吗

Java可以在没有GC的情况下运行吗,java,rust,Java,Rust,我在网上找不到太多关于这方面的信息,但我的想法是,当从内存中释放对象时,一种类似于rust分析的编译语言。为什么Java不能做到这一点呢?那么我们就不需要垃圾收集器了。除非这会使编码变得更复杂 所以问题是Java编译器能否在运行前管理内存Java可以进行“简单”的清理,在这种情况下,它可以确定对象没有从堆栈中泄漏,因此在清理堆栈时可以安全地进行清理。这也用于其他方式,例如,当您输入synchronized块时,确定是否需要获取锁:如果保证引用是堆栈限制的,则不需要获取锁,因为没有任何其他线程看到

我在网上找不到太多关于这方面的信息,但我的想法是,当从内存中释放对象时,一种类似于rust分析的编译语言。为什么Java不能做到这一点呢?那么我们就不需要垃圾收集器了。除非这会使编码变得更复杂

所以问题是Java编译器能否在运行前管理内存

Java可以进行“简单”的清理,在这种情况下,它可以确定对象没有从堆栈中泄漏,因此在清理堆栈时可以安全地进行清理。这也用于其他方式,例如,当您输入
synchronized
块时,确定是否需要获取锁:如果保证引用是堆栈限制的,则不需要获取锁,因为没有任何其他线程看到它的风险

Java和Rust的区别在于Rust具有严格的所有权概念,因此可以静态地知道何时可以安全地清理所有对象;Java没有这个概念,所以它通常必须依靠GC来解决这个问题

因此,本质上,不,Java不能没有GC,因为这就是语言的设计方式;Rust可以不使用GC,因为这就是该语言的设计方式。

Java可以进行“简单”清理,它可以确定对象没有从堆栈泄漏,因此在清理堆栈时可以安全地进行清理。这也用于其他方式,例如,当您输入
synchronized
块时,确定是否需要获取锁:如果保证引用是堆栈限制的,则不需要获取锁,因为没有任何其他线程看到它的风险

Java和Rust的区别在于Rust具有严格的所有权概念,因此可以静态地知道何时可以安全地清理所有对象;Java没有这个概念,所以它通常必须依靠GC来解决这个问题


因此,本质上,不,Java不能没有GC,因为这就是语言的设计方式;Rust可以不使用GC,因为这就是该语言的设计方式。

如果我没记错的话,JavaCard要么使用较少的GC,要么至少具有较少的GC配置。因此,虽然在特定的配置中是可能的,但结果系统对于通用工作来说也不是很有用(换句话说:它只适用于专门为该模式编写的代码)。因此,虽然在特定配置中是可能的,但生成的系统对于通用工作也不是很有用(换句话说:它只适用于专门为该模式编写的代码)。此外,如果使用Arc/Rc来防止泄漏,则需要手动处理引用循环。在像Java这样的GCed语言中,这从来都不是问题。@Angelicos谢谢,你显示了我对生锈的缺乏:)我猜你指的是什么?当然:在这种情况下,Rust提供了一种手动处理内存管理的机制,而Java没有。ARC的问题在于,它可能会导致内存泄漏。示例:相比之下,Java GC使用可达性分析,这可以证明整个引用周期是不可访问的。此外,如果使用Arc/Rc来防止泄漏,则需要手动处理引用周期。在像Java这样的GCed语言中,这从来都不是问题。@Angelicos谢谢,你显示了我对生锈的缺乏:)我猜你指的是什么?当然:在这种情况下,Rust提供了一种手动处理内存管理的机制,而Java没有。ARC的问题在于,它可能会导致内存泄漏。示例:相比之下,JavaGC使用可达性分析,这可以证明整个引用周期是不可到达的。