当前位置: 首页 > 面试题库 >

Java中的转义分析

毕宏盛
2023-03-14
问题内容

据我所知,JVM将转义分析用于某些性能优化,例如锁粗化和锁省略。我很想知道JVM是否有可能使用转义分析来决定可以在堆栈上分配任何特定对象。

一些资源使我认为我是对的。是否有实际执行此操作的JVM?


问题答案:

我不认为它会进行堆栈分配的分析。例:

public class EscapeAnalysis {

    private static class Foo {
        private int x;
        private static int counter;

        public Foo() {
            x = (++counter);
        }
    }
    public static void main(String[] args) {
        System.out.println("start");
        for (int i = 0; i < 10000000; ++i) {
            Foo foo = new Foo();
        }

        System.out.println(Foo.counter);
    }
}

-server -verbose:gc -XX+DoEscapeAnalysis

开始
[GC 3072K-> 285K(32640K),0.0065187秒]
[GC 3357K-> 285K(35712K),0.0053043秒]
[GC 6429K-> 301K(35712K),0.0030797秒]
[GC 6445K-> 285K(41856K),0.0033648秒]
[GC 12573K-> 285K(41856K),0.0050432秒]
[GC 12573K-> 301K(53952K),0.0043682秒]
[GC 24877K-> 277K(53952K),0.0031890秒]
[GC 24853K-> 277K(78528K),0.0005293秒]
[GC 49365K-> 277K(78592K),0.0006699秒]
10000000

据称JDK 7支持堆栈分配。



 类似资料:
  • 问题内容: 在Java中,我了解到以下语法可用于提及键盘上没有的Unicode字符(例如,非ASCII字符): 我的问题是:以上语法中(u)*的目的是什么? 我理解的一个用Java表示日元符号的用例是: 问题答案: 有趣的问题。JSL的3.3节说: 转化为 和 如果合格的\后跟u,或不止一个u,并且最后一个u后不跟四个十六进制数字,则发生编译时错误。 因此,您是对的,反斜杠后可以有一个或多个。原因

  • 问题内容: 我正在用Java 7中的转义分析进行一些测试,以便更好地了解哪些对象可以进行堆栈分配。 这是我编写的用于测试堆栈分配的代码: 这是它在Linux上与Java 7一起输出的结果 我正在使用GC日志来了解是否在堆栈上分配了对象,这可能不是100%可靠的,但似乎给出了很好的提示。 基于输出,堆栈分配适用于test1,test3,test4和test6,不适用于test2和test5。我不明白

  • 问题内容: 我正在尝试下面的代码,但出现错误 错误 我想要结果 问题答案: 请改用,它不使用正则表达式,因为您根本不需要它们: 这将按预期打印。

  • 问题内容: 目前,我过去通常在字符串中转义不需要的HTML标记,但是后来我意识到它也可以转义带有重音的字符,这是我不想要的。 您是否知道任何用于转义HTML标记的解决方案,但请保留我的特殊字母(对某些人来说,这是正常的;])。 提前致谢! 巴拉斯 问题答案:

  • 问题内容: 我想知道Java中是否像C ++中一样有类似的十六进制(\ x)转义符。例如: 到目前为止,Java中没有出现十六进制(\ x)转义符。是否有一种无需使用一堆十六进制数字就一样容易使用的替代方法? 问题答案: Java中的字符串始终以UTF-16编码,因此它使用Unicode转义:。还支持八进制字符:

  • 本文向大家介绍Java转义字符,包括了Java转义字符的使用技巧和注意事项,需要的朋友参考一下 示例 通常 要使用正则表达式中的特定字符(?+|等),按其字面意思,必须对其进行转义。在常规正则表达式中,这是通过反斜杠完成的\。但是,由于它在Java字符串中具有特殊含义,因此必须使用双反斜杠\\。 这两个示例不起作用: 这个例子有效 分割管道分隔字串 这不会返回预期的结果: 这将返回预期结果: 转义