当前位置: 首页 > 知识库问答 >
问题:

受到JVM/jvm-options[closed]影响的代码示例

夹谷苗宣
2023-03-14

我正在寻找结果取决于以下内容的代码示例:

  • Java版本
  • 虚拟机
  • Java选项/JVM选项
Integer foo = 400;
Integer bar = 400;
System.out.println(foo == bar)

看着这段代码,很多人会猜到它是假的,但这取决于IntegerCache.high的值,该值可以用-djava.lang.Integer.IntegerCache.High=1000更改

我想,有很多例子可以用内存限制来改变行为,但是还有更多意想不到的例子吗?

共有1个答案

江展
2023-03-14

Java版本影响:

1)看看这样阅读器:

public class Reader {
   private final String input;
   private int currentPosition;
   private Pattern numberPattern = Pattern.compile(...);

   public String readNextInt() {
       return numberPattern.matcher(input.substring(currentPosition)).group();
   }
}

在早于7的Java版本中,这段代码可以正常工作,因为String.subString()只是共享其内部缓冲区,并存储两个指向缓冲区开始/结束的指针。但是在Java7中,这种行为被改变了,现在每个substring()调用都会创建一个带有自己缓冲区的新String对象,这极大地影响了代码的性能,特别是在字符串较大的情况下。

对于向后兼容或不同体系结构之间的兼容,有strictfp修饰符。

3)在Java8中,所有与反射相关的代码都进行了高度优化,因此切换到较新的版本将显著提高任何与反射相关的代码的性能。

4)Java5和JSR-133。JSR-133是一个全新的内存模型,没有了前一个模型的缺陷。Final和volatile字段语义发生了变化。此外,Java并发编程的许多方面也发生了变化,所以您可以预期在Java5前后多线程程序的行为完全不同。您可以在这里阅读更多关于JSR-133的信息。

5)在Java7中修改了Mergesort实现。它会导致旧代码抛出一个IllegalArgumentException。在这里阅读更多内容。

6)每一个新的java版本都引入了一些性能改进或bug修复,所以通常您可以看到一些小的改进(或者甚至没有,例如java 8中大量增强的转义分析,以避免在堆上分配lambda),但在极少数情况下也可能出现速度减慢的情况。

VM:除了hotspot,我对VM不太了解,但是你可以期待一些JIT的改进/减慢,不同的内存消耗和GC停滞(比如Azul Zulu有它无用的c4收集器和很高的内存需求),甚至静态的提前编译,比如Excelsior Jet。但通常情况下,您清楚地知道在JVM实现之间切换时正在做什么。

Java选项/JVM选项:

1)偏置锁定。像-xx:+usebiasedLocking和-xx:biasedLockingStartupDelay=n这样的标志可以根据您的并发配置文件改变应用程序的性能,所以玩这些东西既可以增强也可以损害您的应用程序。例如,在Azul中,当您试图撤销偏置锁时,工程师们给出了由于不可避免的STW而导致的偏置锁定(是的,对于足以停止两个线程的锁撤销,但根据设计,在hotspot中只有全局STW)。

2)xx:+ALWAYSPRETOUCH标志在JVM启动时触摸和零所有内存页,以避免运行时的惩罚,并防止linux窃取您的页。

4)-xx:+bindgctaskthreadstocpu现在没有在JDK8中实现,但可能以后会影响您的gc性能:)

5)-xx:+USENUMA可以提高您在NUMA体系结构上的性能,JVM将尝试为NUMA节点分区堆。本文指出“使用NUMA感知分配器,性能提高了大约40%”。

6)-xx:+UseCondCardMark可以帮助您在高并发应用程序中防止您不太期望错误共享。在java中,堆是在512字节的区域(“卡”)上分开的,程序中的每一次写入都会导致对相应卡的易失性写入(外部对象的地址移9)。因此,平均64张卡共享相同的L1高速缓存线。这意味着在一个32Kbyte(=512*64)区域中的对象内写入会导致对同一缓存行的写入,这会降低应用程序的性能。-xx:+usecondcardmark用if(卡[address>>9]==0)卡[address>>9]=1替换对卡表的写操作,这样可以将每个32KB区域中的易失性写操作从数百个减少到一个。

7)有很多标志会影响GC性能,但我相信您可以自己挖掘出所有关于它的内容,因为在这里编写GC调优的所有建议并不有趣。

 类似资料:
  • 我正在用python(2.7)创建一个程序,我想保护它不受逆向工程的影响。

  • 如果您已经安装了32位JDK,请在中定义一个JAVA_HOME变量 我已经在Enviorment Setting中设置了JAVA_HOME路径。 我使用的是32位Windows7机器和32位1.8java版本在他的机器。

  • 我们有一个具有以下参数的tomcat Xms 1g Xmx 4g并行GC,它安装在带有JVM 1.8.181的Ubuntu机器上 最近GC正在全速启动,并且不让任何其他进程继续。我不明白的是,当总JVM只有2.8 GB而最大堆可以达到4GB时,就会发生这种情况。为什么当内存没有达到最大值时,全GC会运行? 当我深入挖掘时,我发现在使用和promise的记忆中有一个突然的变化;从1 GB到约4GB。

  • 我下载了birt-report-designer-all-in-one-2_5_0。环境是windows 7,8GB内存,64位操作系统和JDK1.6.0_45(64位),但在启动时抛出此错误 我的eclipse.ini是 -启动插件/org.eclipse.equinox.launcher_1.0.200.v20090520.jar --Launcher.Library plugins/org.

  • 我写了一个fastapi应用程序。现在我正在考虑部署它,但是我似乎遇到了奇怪的意外性能问题,这似乎取决于我使用的是uvicorn还是gunicorn。特别是,如果我使用gunicorn,所有代码(甚至是标准库纯python代码)似乎都会变慢。为了进行性能调试,我编写了一个小应用程序来演示这一点: 运行Fastapi Appi与: get to的共振体始终类似于: 然而使用: 我经常得到这样的时机

  • 问题内容: 如果有人可以给我简要介绍这两个JVM的优缺点,因为它们都依赖于标准JVM规范。 问题答案: JRockit最初由Appeal和BEA Systems开发,然后被Oracle收购以运行服务器软件。1旨在针对需要长时间运行的任务,大量内存和可伸缩环境的大型应用程序进行优化,从而将这些方案的优化推到服务器模式下的SunHotSpot JVM之外 自甲骨文收购Sun Microsystems以