问题标签 [java-memory-model]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
7389 浏览

java - 我可以为 4GB 和 8GB Ram 提及多少 -XX:MaxPermSize 大小并为此计算?

对于 4GB 和 8GB Ram,我可以提到多少 -XX:MaxPermSize 大小。这是我系统的其他细节

操作系统:-window XP(32 位) RAM:-4 GB java_opt- -Xms1536m -Xmx1536m //(作为环境变量提及):tomcat 版本:-6.0.26

我有另一个带有 8GB 内存的系统,其他细节完全相同。是的,操作系统是 64 位 Window 7。

除此之外,还让我知道两个系统的 -Xmx 参数的最大值是多少?

如果有人可以告诉我计算得出该数字,那将是很棒的,这样我们就不必填写这个数字,但我们可以根据 RAM 系统进行逻辑计算?

我确实看到人们遇到 permgen 错误或堆错误,但每个人都在不断地使用这个参数,直到他们想出解决问题的方法。

0 投票
0 回答
2876 浏览

java - 为任何系统配置找到最大堆大小和最大永久代大小的程序/方法?

要测试最大堆大小和最大 permgen 空间,根据 Gilli在 Windows 中每个 java 进程的最大内存量中建议的回复?,我写了一个简单的java类,主要方法只是打印系统

当我使用以下参数从控制台运行该类时,它运行良好,但使用 2048 它给出了错误无法保留无法为对象堆保留足够的空间。这意味着对于我的系统,最大堆大小允许在 1536 到 2048 之间

根据http://publib.boulder.ibm.com/infocenter/javasdk/tools/index.jsp?topic=/com.ibm.java.doc.igaa/_1vg00014884d287-11c3fb28dae-7ff6_1001.html的链接,据说

在运行 64 位 Java 时,操作系统提供给 Java 进程的内存空间非常大。因此,您可以假设由于 Java 堆和本机堆之间的内存资源争用,Java 堆的最大大小没有限制。

所以我有 8 GB 的内存,为什么 VM 无法为对象堆保留足够的空间?

现在我想要的第二件事是为我的系统找到最大 permgen 大小。所以我用以下参数运行了相同的程序

但它再次说无法为对象堆保留足够的空间。这怎么可能,因为我有 8GB RAM 和 windows7 64 位操作系统。而且它甚至不允许128m的permgen?我确定我在这里遗漏了一些东西,但无法弄清楚?

0 投票
2 回答
478 浏览

java - 跨线程传递数据时如何确保 Java 中的内存可见性

我有一个生产者消费者模式,其中一些线程正在创建数据并定期传递该数据的块以供其他一些线程使用。

牢记 Java 内存模型,我如何确保传递给消费者线程的数据具有完全的“可见性”?

我知道 java.util.concurrent 中有专门为此构建的 ConcurrentLinkedQueue 之类的数据结构,但我想在不使用它们的情况下尽可能低级别地执行此操作,并对幕后发生的事情完全透明,以确保内存可见性部分。

0 投票
3 回答
2740 浏览

java - java:带有getter和setter的`volatile`私有字段

volatile我们是否应该像在多个线程中使用实例一样声明私有字段?

Effective Java中,有一个示例,如果没有 volatile,代码将无法工作:

解释说

被优化为这样的东西:

所以后台线程看不到进一步的修改stopRequested,所以它永远循环。(顺便说一句,该代码在没有volatileJRE7 的情况下终止。)

现在考虑这个类:

和一个线程如下:

上面的代码在不使用 volatile 的情况下按预期工作:

我认为由于 public setter,编译器/JVM 永远不应该优化调用的代码getField(),但是这篇文章说有一些“Volatile Bean”模式(模式#4),应该应用于创建可变线程安全类. 更新:也许那篇文章仅适用于 IBM JVM?

问题是:JLS 的哪一部分明确或隐含地说必须将具有公共 getter/setter 的私有原始字段声明为volatile(或者它们不必声明)?

抱歉问了一个很长的问题,我试图详细解释这个问题。如果有不清楚的地方,请告诉我。谢谢。

0 投票
1 回答
2231 浏览

android - 传递应用程序活动方法的命令模式?

在阅读了@RomainGuy 的避免内存泄漏文章后,我意识到我当前的 Android 应用程序被传递应用程序的主要活动的错误所困扰。因此,无论何时,我都可以简单地用Activity.getApplicationContext()替换该活动参数。

但是我的应用程序中的某些类仍然需要运行只能是应用程序主活动成员的方法。

因此,我在考虑可能使用命令模式来解决这个限制。

问题是,如果我们看那个例子:

我再次陷入需要绕过活动的死胡同(这次伪装成Object数据)。

我该如何摆脱这种“鸡与蛋”的局面?

有没有更好的方法来解决这个问题?

0 投票
2 回答
2407 浏览

java - 请解释 Java 内存模型中说明的初始化安全性

  1. 有人可以按照 Java 内存模型的要求解释初始化安全吗?
  2. final字段如何帮助实现初始化安全
  3. 构造函数在确保初始化安全方面起什么作用?
0 投票
3 回答
4596 浏览

java - 提升和重新排序是同一件事吗?

我从Effective Java中读到,在没有同步的情况下,下面的序列 A 可以被虚拟机转换为序列 B,这被称为hoisting. 我还在某处读到,如果变量未声明为涉及变量的易失性指令,则可以重新排序。提升和重新排序是同一件事吗?

0 投票
3 回答
2145 浏览

java - 同步数据读/写到/从主存储器

当一个同步方法完成后,是只把它修改过的数据推送到主存,还是把所有的成员变量都推送到主存,同理,同步方法执行时,是只从主存中读取它需要的数据还是清空所有的数据?缓存中的成员变量并从主存中读取它们的值?例如

在上面的代码中,假设计算由线程A 执行,getResult 由线程B 执行。在执行计算之后,线程A 将使用 a 和 b 更新主内存还是更新 a、b、c 和 d。在执行 getResult 之前,threadB 将只从主内存中获取 b 和 c 的值,还是会清除缓存并获取所有成员变量 a、b、c 和 d 的值?

0 投票
5 回答
1149 浏览

java - volatile关于可见性及时性的详细语义

考虑一个volatile int sharedVar. 我们知道 JLS 为我们提供以下保证:

  1. 写入线程的每个操作在w其写入值之前isharedVar程序顺序happens-before写入操作;
  2. i通过读取线程w happens-before成功读取来i写入值;sharedVarr
  3. 读取线程成功读取i程序顺序中的所有后续操作。sharedVarr happens-beforer

但是,对于读取线程何时会观察到该值仍然没有给出挂钟时间保证i。一个根本不会让读取线程看到该值的实现仍然符合此合同。

我已经考虑了一段时间,我看不出有任何漏洞,但我认为一定有。请指出我推理中的漏洞。

0 投票
2 回答
813 浏览

java - Memory allocation in Java - Android

If I have:

Once this code is executed, which of the 4 instances are still in memory? I know .recycle() instructs the native code to deallocate all resources to that object, but there's no guarantee of when that happens.

The reason I'm asking, is let's look at the following loop:

This I assume will eventually crash the app (out of memory)? If so, how should this loop be rewritten? (If I'm using bitmap to animate and display changed state).