假设我有一个 java.util.Collection 想要循环。通常我会这样做:
for(Thing thing : things) do_something_with(thing);
Run Code Online (Sandbox Code Playgroud)
但是假设这是在一些到处使用的核心实用方法中,并且在大多数地方,集合是空的。那么理想情况下,我们不希望仅仅为了执行无操作循环而对每个调用者强加迭代器分配,并且我们可以重写如下内容:
if(things.isEmpty()) return;
for(Thing thing : things) do_something_with(thing);
Run Code Online (Sandbox Code Playgroud)
如果是列表,则更极端的选择things是使用 C 样式for循环。
但是等等,Java 转义分析应该消除这种分配,至少在 C2 编译器处理此方法之后。所以应该不需要这种“纳米优化”。(我什至不会用微优化这个词来形容它;它对于这个来说有点太小了。)除了......
我一直听说逃逸分析是“脆弱的”,但似乎没有人谈论过什么会导致它变得混乱。直觉上,我认为更复杂的控制流将是最值得担心的,这意味着 for-each 循环中的迭代器应该被可靠地消除,因为那里的控制流很简单。
这里的标准响应是尝试进行实验,但除非我知道其中的变量,否则很难相信我可能想从这样的实验中得出的任何结论。
事实上,在这篇博客文章中,有人尝试了这样的实验,三分之二的分析器给出了错误的结果:
http://psy-lob-saw.blogspot.com/2014/12/the-escape-of-arraylistiterator.html
我对晦涩难懂的 JVM 魔法的了解比该博客文章的作者要少得多,而且很可能更容易被误导。
默认情况下,大多数 Web 浏览器将页面呈现为具有白色背景。然而,这在某种程度上是用户可定制的,并且某些浏览器是不同的。所以,我想找到一种方法,通过 CSS 或 JavaScript,找出页面的背景颜色。Mozilla 网站上的文档建议可以使用 document.bgColor,并且其默认值为白色。它还建议不要使用它,因为它已被弃用。但是文档似乎与观察到的行为相冲突:如果页面没有 CSS 来更改它,则 document.bgColor 是一个空字符串。建议的替代方案也不起作用:我尝试的所有内容都给我一个空字符串或“透明”,这显然是错误的:我看不到浏览器下方的桌面,因此它不透明。(顺便,IE11 实际上就像 Mozilla 的文档所说的 Firefox 一样。去搞清楚。)
我想创建一个 html 列表元素 ( <ul>),其背景颜色与文档的背景颜色相匹配。这可能吗?(我想你可能会问:如果我想让它与背景相匹配,我想要的不是“透明”吗?不。我想让它掩盖一些其他元素。为什么?因为我正在制作其中之一那些自动建议的东西。)
编辑:有 2 个人明智地建议我添加一个示例,以便清楚我在说什么。根据我收到的答案,这两个人是绝对正确的。我在其中一个答案的评论中添加了一个指向小提琴的链接,现在我在这里添加它:
我知道 Java HotSpot 用来决定一个方法是否值得内联的标准之一是方法的大小。一方面,这似乎是明智的:如果方法很大,内联会导致代码膨胀,并且该方法需要很长时间来执行,以至于调用开销是微不足道的。这种逻辑的问题在于,在您决定内联之后,很明显,对于这个特定的调用站点,大部分方法都是死代码。例如,该方法可能是一个巨大的 switch 语句,但大多数调用站点使用编译时常量调用该方法,因此实际上:内联很便宜(不需要整个方法体;最小的代码膨胀)并且有效(方法调用开销支配实际完成的工作)。
HotSpot 是否有任何机制来利用这种情况并无论如何内联方法,或者是否存在限制甚至拒绝考虑内联方法的限制,即使它具有最小的代码膨胀效应?
假设您有一个<ol>包含数千个项目的有序列表(),最终这些数字将有四位数,甚至更多.如果将这些数字格式化为"1,234"而不是浏览器默认值"1234",则这些数字将更容易阅读.有没有办法用CSS,JavaScript或其他方式做到这一点?
我一直在努力学习Perl几天,而且我仍然经常感到惊讶,有时会对它如何以及为什么做事情感到困惑.这是我最新的谜题:为什么以下两个代码块不相同?
my $thing = '';
bless \$thing; # class is implicit
Run Code Online (Sandbox Code Playgroud)
与
my $thing = \'';
bless $thing; # class again implicit
Run Code Online (Sandbox Code Playgroud)
第二种形式在第二行上显示"尝试修改只读值".
build.gradle文件是一个语法上有效的Groovy脚本吗?如果正确的类在类路径中,它会编译吗?例如,假设你有task hello{}.如果我理解正确,这会创建一个Task类型的变量,其名称为hello.但是在Groovy中肯定不可能这样做?变量用声明def.由于未声明的标识符,为什么这不会失败?
这个问题是关于偏向锁定的启发式Java使用之一。下一段是给将来的读者的。我怀疑任何可以回答这个问题的人都可以安全地跳过它。
据我了解,曾几何时,人们注意到Java有许多线程安全的类,但是它们的实例往往仅由一个线程使用,因此Sun引入了偏向锁以利用这一点。问题是,如果您“猜错了”并尝试从两个线程中偏向需要使用的锁,则即使没有争用,也需要撤消(“撤销”)偏见,这太昂贵了,以至于JVM会尽力避免这种情况,即使这意味着有时在偏向锁定可能会最终获胜的情况下也会错过这一机会。
我也知道有时JVM会决定执行“批量”重新偏置,并将许多某种类型的所有锁迁移到另一个线程。这个问题不是关于这个的。出于这个问题的目的,假设我只有两个线程和一个锁。(实际情况更加复杂,并且涉及线程池,但现在暂时不考虑它。确实,假装我没有提到它。)进一步假设线程A沿着“睡眠几秒钟”的方式运行无限循环。 ,在锁定下递增整数,然后重复”。(并不是真的没什么用,但这应该足以使观点明白。)同时,线程B运行类似的循环,但是睡眠时间是几小时而不是几秒钟。进一步假设调度程序是不可思议的,并保证永远不存在任何争用。
现在,假设我们关心线程A唤醒和成功递增其整数之间的平均延迟。据我了解,JVM最初会将锁定偏向A,然后在线程B第一次唤醒时取消偏向。
我的问题是:JVM是否会认识到其最初的猜测基本上是正确的,从而再次将锁重新分配给线程A?
我使用的是IntelliJ IDEA,它有一个叫做结构搜索的漂亮功能.我想用它来查找最后有注释的所有类中的所有字段,如下所示:
class Thing {
double x; // arbitrary comment (any text goes here)
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我尝试过的任何东西似乎都没有用.
java ×3
jvm ×3
jvm-hotspot ×3
css ×2
html ×2
javascript ×2
jit ×2
colors ×1
gradle ×1
groovy ×1
html-lists ×1
perl ×1
reference ×1
synchronized ×1