Tag: jvm

禁用特定方法/类的Java JIT?

我在我的Java应用程序中遇到了一个JIT破坏代码的问题。 如果我禁用JIT,一切正常,但运行速度慢10-20倍。 有没有办法禁用特定方法或类的JIT? 编辑:我正在使用Ubuntu 10.10,获得相同的结果: OpenJDK Runtime Environment (IcedTea6 1.9) (6b20-1.9-0ubuntu1) OpenJDK 64-Bit Server VM (build 17.0-b16, mixed mode) 和: Java(TM) SE Runtime Environment (build 1.6.0_16-b01) Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)

JVM如何处理标记接口

标记界面没有任何东西。 它只包含接口声明,然后由JVM如何处理实现此标记接口的类? 我们可以创建任何新的标记接口吗?

使用UseConcMarkSweepGC减少JVM暂停时间> 1秒

我在一台具有16Gb RAM,8核处理器和Java 1.6的机器上运行内存密集型应用程序,所有这些都运行在CentOS 5.2版(最终版)上。 精确的JVM详细信息是: java version “1.6.0_10” Java(TM) SE Runtime Environment (build 1.6.0_10-b33) Java HotSpot(TM) 64-Bit Server VM (build 11.0-b15, mixed mode) 我正在使用以下命令行选项启动应用程序: java -XX:+UseConcMarkSweepGC -verbose:gc -server -Xmx10g -Xms10g … 我的应用程序公开了一个JSON-RPC API,我的目标是在25ms内响应请求。 不幸的是,我看到延迟超过1秒,似乎是垃圾收集造成的。 以下是一些较长的例子: [GC 4592788K->4462162K(10468736K), 1.3606660 secs] [GC 5881547K->5768559K(10468736K), 1.2559860 secs] [GC 6045823K->5914115K(10468736K), 1.3250050 secs] 这些垃圾收集事件中的每一个都伴随着延迟的API响应,其持续时间与所示的垃圾收集的长度非常相似(在几毫秒内)。 以下是一些典型示例(这些示例均在几秒钟内生成): [GC 3373764K->3336654K(10468736K), 0.6677560 secs] [GC 3472974K->3427592K(10468736K), […]

即使坏人试图抓住它,如何在任何OutOfMemoryException上退出JVM

OOME是一类错误,通常你不应该从中恢复。 但是如果它被隐藏在一个线程中,或者有人捕获它,那么应用程序可能会进入一个它不会退出的状态,但是没有用处。 有关如何防止这种情况的任何建议,即使面对使用可能愚蠢地尝试捕获Throwable或Error / OOME的库? (即您没有直接访问权限来修改源代码)

用于优化循环语句的JVM选项

我在学校被告知,修改for loop的索引变量是一种不好的做法: 示例: for(int i = 0 ; i < limit ; i++){ if(something){ i+=2; //bad } if(something){ limit+=2; //bad } } 争论的焦点是, 某些编译器优化可以优化循环,而不是重新计算索引并在每个循环中绑定。 我已经在java进行了一些测试,似乎默认索引和绑定每次都会重新计算。 我想知道是否可以在JVM HotSpot激活这种function? 例如,要优化这种循环: for(int i = 0 ; i < foo.getLength() ; i++){ } 无需写: int length = foo.getLength() for(int i = 0 ; i < length ; i++){ } […]

Lambda表达式如何在Java字节代码中进行翻译

我试图在java中使用lambda表达式创建一个示例,我正在使用官方JDK8。 我的例子运行成功。 但是当我试图检查编译器如何将lambda表达式转换为字节代码时,这让我有些困惑。以下是我的例子的代码: – public class LambdaTest { public Integer lambdaBinaryOpertor(BinaryOperator binaryOperator) { return binaryOperator.apply(60, 72); } public static void main(String[] args) { LambdaTest test = new LambdaTest(); BinaryOperator binaryOperator = (a, b) -> a*b; System.out.println(“Additon using Lambda BinaryOperator: “+test.lambdaBinaryOpertor(binaryOperator)); } } 在本文中,他们讨论了编译器如何将lambda表达式转换为字节代码。 根据这个文档,lambda表达式转换为static方法和lambda表达式声明的位置,具有lambda static方法的引用。 以下示例位于文章中: //Source code class A { public void foo() { […]

JVM最大堆大小可以动态吗?

JVM -Xmx参数允许将JVM的最大堆大小设置为某个值。 但是,有没有办法让这个价值变得有活力? 换句话说,我想告诉JVM“看看,如果你需要它,只需继续从系统中取RAM,直到系统出来。” 问题的两个部分:首先,有问题的应用程序可以使用非常广泛的ram,具体取决于用户正在做什么,因此概念性最小值和最大值相差很远。 其次,JVM似乎在启动时保留虚拟内存的最大堆空间。 这个特定的应用程序运行在各种各样的硬件上,因此选择“一刀切”的最大堆空间很难,因为它必须足够低才能在低端硬件上运行,但我们真的喜欢能够利用真正强劲的机器,如果它们可用的话。

JVM如何在实践中收集SoftReferences?

我有一个在JVM中运行的两个单独的缓存(一个由第三方库控制),每个缓存都使用软引用。 我希望JVM在由库控制的缓存之前清除我的受控缓存。 SoftReference javadoc指出: 在虚拟机抛出OutOfMemoryError之前,保证已清除对软可访问对象的所有软引用。 否则,不会对清除软引用的时间或清除对不同对象的一组此类引用的顺序施加约束。 但是,鼓励虚拟机实现偏向清除最近创建或最近使用的软引用。 此类的直接实例可用于实现简单缓存; 此类或派生的子类也可用于更大的数据结构,以实现更复杂的高速缓存。 只要软引用的引用是强可达的,即实际上是在使用中,软引用就不会被清除。 因此,复杂的高速缓存可以例如通过保持对这些条目的强烈指示来防止其最近使用的条目被丢弃,留下剩余的条目由垃圾收集器决定丢弃。 常见的JVM实现(尤其是HotSpot)如何在实践中处理SoftReferences? 他们是否“反对清除最近创建或最近使用的软参考”,这是由规范鼓励的?

Java在try-catch-finally机制中的返回值

我刚刚遇到以下代码: public class TestFinally { public static void main(String[] args) { int returnValue = function(); System.out.println(“Return value: ” + returnValue); } public static int function() { try { return 1; } catch (Exception e){ return 2; } finally{ return 3; } } } 毫无疑问,运行此代码将产生“返回值:3”的输出。 但是,我很好奇: JVM中内部机制。 有没有人知道VM是否实际上通过覆盖第一个“返回1”来替换堆栈上的返回值? 如果是这样,我在哪里可以找到更多相关信息。 我还没有找到在这种方式下使用的finally机制中返回的用法,并允许在JVM中实现。 如果此代码构造用作返回错误代码的方法,则在我看来有更好的方法来记录错误或返回这些错误代码。 有没有人发现这种结构的用途? 提前谢谢了。 干杯,Vern

桌面上的JVM是否使用JIT编译?

我总是遇到声称Java被解释的文章。 我知道Oracle的HotSpot JRE提供即时编译,但对于大多数桌面用户来说情况如此吗? 例如,如果我通过以下url下载Java: http : //www.java.com/en/download ,这是否包含JIT编译器?