账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    JVM逃逸分析
    47
    0

    最近学习JVM时,开启逃逸分析栈上分配对象优化,在实践中发现并没有任何效果!!

    开启逃逸分析,JVM参数:

    -server -verbose:gc -XX:+DoEscapeAnalysis  

    不开启就是去掉后面的-XX:+DoEscapeAnalysis参数

    主要代码

    package com.cjt;
    
    public class Test {
    
      private static class Foo {
        private int x;
        private static int counter;
    
        public Foo() {
          x = (++counter);
        }
      }
    
      public static void main(String[] args) {
        long start = System.nanoTime();
        for (int i = 0; i < 1000 * 1000 * 10; ++i) {
          Foo foo = new Foo();
        }
        long end = System.nanoTime();
        System.out.println("Time cost is " + (end - start));
      }
    
    }
    

    最终结果是,无论上述JVM参数如何设置,JVM gc不变,没有出现网上那种“栈上分配对象,堆上gc不会发生”现象。gc日志如下:

    [GC 30464K->616K(116800K), 0.0014522 secs]
    [GC 31080K->568K(116800K), 0.0010129 secs]
    [GC 31032K->600K(116800K), 0.0008023 secs]
    [GC 31064K->552K(147264K), 0.0014494 secs]
    Time cost is 57097349

    不知是哪里出现问题,我也设置过-Xmx调整堆大小,没有作用。不太清楚网络上的文章都经过实践没有!

    望知情大佬解决,感谢!

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ﹏淺Sè时光つ 普通会员 1楼

      JVM逃逸分析是一种工具,用于识别程序中的非法行为和未使用的变量。它可以在程序运行时进行分析,从而发现程序中的逃逸、未使用的变量和潜在的安全问题。

      JVM逃逸分析主要通过以下几个步骤进行:

      1. 分析:程序的内存分配、栈跟踪和代码分析,确定程序中的变量和数据结构。

      2. 判断:检查程序中的变量是否被异常抛出,是否被无条件地访问,是否被非法修改,是否被尝试通过垃圾回收来清除。

      3. 分析:检查程序中的数据结构,确定是否可能产生未使用的变量,以及这些变量的生命周期。

      4. 判断:检查程序中的函数调用,确定是否可能产生未使用的函数,以及这些函数的生命周期。

      5. 发现:通过以上步骤,JVM可以发现程序中的逃逸、未使用的变量和潜在的安全问题。

      JVM逃逸分析在软件安全开发中具有重要作用,它可以及时发现程序中的安全问题,帮助开发人员修复这些问题,从而提高软件的安全性。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部