我正在用java创建一个桌面应用程序,并且正在做一些内存优化.这让我遇到了在JVM中运行的两个线程,两个线程都命名为:
RMI TCP连接
他们都非常有助于堆增长(从我的角度来看)
现在我不太了解,但TCP听起来像是一些互联网的东西.从我在谷歌上找到的,它与互联网上的序列化/反序列化有关.
但我的应用程序不需要互联网,所以我想知道两件事:
我的工具是"Java visualVM".虽然我已经想到这两个线程是由于使用这个工具而产生的,在这种情况下我会觉得有点愚蠢.
从我读过的内容来看,java 中的“volatile”关键字确保线程始终获取特定指针的最新值,通常通过直接从/向内存读取/写入以避免缓存不一致。
但为什么需要这样做呢?据我所知,这已经在硬件级别上完成了。如果我从我的系统架构类中没有记错的话,更新内存位置的处理器核心会向其他处理器的缓存发送无效信号,迫使它们在需要时从内存中获取这些行。或者,如果情况相反——如果处理器获取内存,它将强制其他缓存的缓存(但未写入)行首先刷新到内存中。
我唯一的理论是,尽管我已经阅读了所有解释,但这实际上与缓存完全无关。它与 JVM 中的数据可以驻留在两个地方有关 - 线程的本地堆栈和堆。并且 Java 线程可以将其堆栈用作一种缓存。我会买那个,但这也意味着对驻留在堆上的数据使用 volatile 是无用的,因为它由所有线程共享并遵守硬件实现的一致性?
例如:
public final int[] is = new int[10];
Run Code Online (Sandbox Code Playgroud)
访问 is 的数据将始终导致获得最新的数据,因为数据驻留在堆上。然而,指针是一个原语,可能会成为堆栈问题的受害者,但由于它是最终的,我们没有这个问题。
我的假设正确吗?
编辑:据我所知,这不是重复的。所谓的重复线程是那些误导性的答案之一,它说它与缓存一致性有关。我的问题不是 volatile 用于什么,也不是如何使用它。它正在测试一种理论,并且进行更深入的测试。