- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
与Can JIT be prevented from optimising away method calls?相似,我试图跟踪长期存在的数据存储对象的内存使用情况,但是我发现,如果我初始化一个存储,记录系统内存,然后初始化另一个存储,有时是编译器(大概是JIT) )足够聪明,可以注意到不再需要这些对象。
public class MemTest {
public static void main(String[] args) {
logMemory("Initial State");
MemoryHog mh = new MemoryHog();
logMemory("Built MemoryHog");
MemoryHog mh2 = new MemoryHog();
logMemory("Built Second MemoryHog"); // by here, mh may be GCed
}
}
main()
不再使用这些对象。我可以在上一个
logMemory()
调用之后添加对这些对象的调用,但这是一种相当手动的解决方案-每次测试一个对象时,我都必须在最后一个
logMemory()
调用之后进行某种副作用触发调用,否则我可能会得到不一致的结果。
System.out.println(mh.hashCode()+mh2.hashCode())
方法末尾添加像
main()
这样的调用就足够了,但是出于某些原因,我不喜欢这样做。首先,它引入了上述测试的外部依赖性-如果删除了SOUT调用,则在内存记录调用期间JVM的行为可能会更改。其次,它容易出现用户错误;如果上面测试的对象发生了更改,或者添加了新对象,则用户必须记住也要手动更新此SOUT调用,否则它们将在测试中引入难以检测到的不一致之处。最后,我完全不喜欢打印此解决方案-似乎可以通过更好地理解JIT优化来避免不必要的黑客攻击。最后一点,Patricia Shanahan的答案提供了一个合理的解决方案(明确显示输出是出于记忆理智的目的),但我仍然希望尽可能避免这种情况。
public class MemTest {
private static ArrayList<Object> objectHolder = new ArrayList<>();
public static void main(String[] args) {
logMemory("Initial State", null);
MemoryHog mh = new MemoryHog();
logMemory("Built MemoryHog", mh); // adds mh to objectHolder
MemoryHog mh2 = new MemoryHog();
logMemory("Built Second MemoryHog", mh2); // adds mh2 to objectHolder
}
protected void finalize() throws Throwable {
for(Object o : objectHolder) {
o.hashCode();
}
}
}
protected void finalize() throws Throwable {
int codes = 0;
for(Object o : loggedObjects) {
codes += o.hashCode();
}
System.out.println(codes);
}
System.out.println()
将防止JIT删除此代码,因为它是一种具有外部副作用的方法,因此即使它不影响程序,它也可以不会被删除。这是有前途的,但是如果可以的话,我真的不希望输出任何乱码。 JIT无法(或不应该!)优化掉
System.out.println()
调用这一事实向我暗示了JIT具有副作用的概念,如果我能告诉它这个finalize块具有此类副作用,它应该永远不要优化它。
.hashCode()
这样的琐碎事情就足够了吗?
System.out.println
)无法优化,甚至更好吗,是否有某种方法告诉JIT不要优化方法调用/代码块?
最佳答案
这是一个计划,可能有些大材小用,但是应该是安全且相当简单的:
保留对对象的引用列表。
最后,遍历列表,对hashCode()结果求和。
打印哈希码的总和。
打印总和可确保无法优化最终循环。对于每个对象创建,您唯一需要做的就是将其放入List add调用中。
关于java - 防止Java 7过早发生GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15193878/
我的测试代码: int SIZE = 1900; int[][] array = new int[SIZE][]; for (int i = 0; i < SIZE; i++) { array[i
我有一堆 WAV 文件和一个将它们复制到另一个目录的脚本,但使用 SoX 处理了一些文件。输出的文件都应该有 1 个 channel ,采样率不超过 44.1khz。我的大多数文件要么有一个以上的 c
我正在运行一个相当占用内存的 Python 脚本,但似乎我的机器正在提前终止进程。我安装了 16GB(并通过 lshw -class memory 确认),但我的进程似乎在使用量达到 4GB 左右时被
我很难确定在使用 .NET 的 HttpWebRequest 类调用远程服务器(特别是 REST Web 服务)时是否有办法处理潜在的连接问题。根据我的调查,WebClient 类的行为是相同的,这在
所以我有这个网址: http://test.com/afolder/who-else-wants-to-make-horror-movies%3f/ 这是 URL 编码版本: http://test.
我是一名优秀的程序员,十分优秀!