Tag: jvm hotspot

如何编写代码以提示JVM使用向量操作?

一些相关的问题和一年之久: JVM的JIT编译器是否生成使用向量化浮点指令的代码? 前言:我试图在纯java中执行此操作(没有JNI到C ++,没有GPGPU工作等等)。 我已经进行了分析,并且大部分处理时间来自此方法中的数学运算(可能是95%的浮点数学运算和5%的整数运算)。 我已经将所有Math.xxx()调用减少到足够好的近似值,因此大部分数学运算现在都是浮点数乘以一些加法。 我有一些处理音频处理的代码。 我一直在进行调整,并且已经获得了巨大的收益。 现在我正在研究手动循环展开以查看是否有任何好处(至少手动展开2,我看到大约25%的改进)。 在尝试手动展开4时(由于我展开嵌套循环的两个循环,这开始变得非常复杂)我想知道是否有任何我可以做的提示到jvm在运行时它可以使用向量操作(例如SSE2,AVX等……)。 音频的每个样本都可以完全独立于其他样本计算,这就是为什么我已经能够看到25%的改进(减少浮点计算的依赖性)。 例如,我有4个浮点数,一个用于循环的4个展开中的每一个,以保存部分计算的值。 我如何声明和使用这些浮子很重要吗? 如果我把它变成一个浮点数[4],它会向jvm暗示它们彼此无关,而不是浮动,浮动,浮动,浮动甚至是一类4个公共浮标? 有什么我可以做的没有意义,这会杀死我的代码被矢量化的机会? 我在网上看到有关“正常”编写代码的文章,因为编译器/ jvm知道常见模式以及如何优化它们并且偏离模式可能意味着更少的优化。 但至少在这种情况下,我不会期望将循环展开2以提高性能,因为我知道是否还有其他任何我可以做(或者至少不做)来帮助我机会。 我知道编译器/ jvm只会变得更好所以我也要警惕做将来会伤害我的事情。 为好奇者编辑:在2次展开时,将4次性能提升另外约25%,因此我认为如果jvm支持它(或者可能已经使用它们),向量操作将对我的情况有所帮助。 谢谢!

当20%的堆仍然是免费的时,为什么我会得到OutOfMemory?

我已将最大堆设置为8 GB。 当我的程序开始使用大约6.4 GB(在VisualVM中报告)时,垃圾收集器开始占用大部分CPU,并且在进行~100 MB分配时程序与OutOfMemory崩溃。 我在Windows上使用Oracle Java 1.7.0_21。 我的问题是,是否有GC选项可以帮助解决这个问题。 除了-Xmx8g,我没有传递任何东西。 我的猜测是堆已经碎片化了,但GC应该不紧凑吗?

如何以编程方式找出我的PermGen空间使用情况?

我正在尝试在Sun的Hotspot JVM上运行时诊断java.lang.OutOfMemoryError: PermGen Space错误,并且想知道我的程序在各个点使用了多少PermGen空间。 有没有办法以编程方式查找此信息?

java中已提交内存的确切状态

我很好奇当从MemoryUsage类查询该值时,“已提交”内存的确切含义。 该类将其解释为“已提交表示保证可供Java虚拟机使用的内存量(以字节为单位)。” 这是否意味着内存正在被jvm进程使用,并且在java进程释放之前不可用于其他进程,或者它是否意味着如果java进程尝试分配高达内存量,则该进程将成功? 我意识到这可能是特定于实现的,但我只对hotspot感兴趣。

Java中的按位AND(&)表达式

我正在调试其中包含expr1 & expr2代码,其中expr1具有影响expr2评估结果的副作用。 我怀疑expr2会在expr1之前得到评估,因为JLS保证对&&进行从左到右的评估,但不一定是& 。 我还怀疑评估顺序的更改可能是HotSpot执行优化的结果(我们正在运行Java 6u20)。 你知道HotSpot能否进行这样的优化吗? 更好的是,提供支持或消除怀疑的文档的任何指针。 提前致谢。 编辑:感谢那些建议重写代码的人,所以它既正确又可读 – 你是对的,但我已经做了,所以这不是我想要的。 不幸的是,很难测试这个变化,这就是为什么我在这里问这个问题。

如何在HotSpot JVM中实现模运算符?

我知道模数运算可以使用一个小的明智的魔法来优化,其中除数是2的幂… 并且可能这是JIT编译器的优化?

Math.pow在重复调用时会产生不同的结果

升级到Java 1.8.0_20后,我们的测试系统报告了错误,但代码没有更改。 我发现,使用完全相同的输入参数调用的Math.pow()调用时会产生不同的结果。 在Java 1.8.0_11中,它的行为与预期的一样,并且总是返回相同的值,但是对于Java 1.8.0_20及更高版本,它有时会返回稍微不同的值。 这类似于Math.pow根据java版本产生不同结果的问题,但不同,因为pow()的结果在一个VM中不同。 在Java 1.8.0_20及更高版本下运行时,以下JUint测试失败 import static org.junit.Assert.assertEquals; import java.util.function.BiFunction; import org.junit.BeforeClass; import org.junit.Test; public class PowerTest { private static final int N = 1000000; private static final double base = 5350.456329377186; private static final double exp = 2.0; private static double eval(final BiFunction f) { return f.apply(base, exp); } private […]

用于访问JDK 8 HotSpot JVM中的字符串池内容的实用程序

是否有任何实用程序或脚本(使用java或本机代码)查看JDK 8 HotSpot JVM中String Pool中存在的所有字符串的列表,而不会对JVM产生很多性能影响? 或者,只要将新字符串添加到JVM中,我是否可以将侦听器连接起来? 谢谢,哈里什

完整的JVM选项列表

除了官方文档,我发现只有这篇文章 。 但它相当陈旧-XX完整(仅提供-XX选项)。 例如,我找不到-XX:AutoBoxCacheMax选项。 如果存在完整列表,可以在哪里找到?

如何以编程方式获取jmap直方图?

我想从受监控的应用程序内部以编程方式获得jmap -histo的输出。 我看到通过HotSpot诊断bean可以触发二进制堆转储,但我看不到如何获取直方图数据。 可能吗 ?