JVM面试核心点

news2024/11/18 17:24:33

 一、JDK体系

二、JVM体系 

 

三、JVM内存模型

public class Math {

    public static final int data = 666;

    public static UserEntity user = new UserEntity();

    public int compute() { // 一个方法对应一块栈帧内存区域
        int a = 1;
        int b = 2;
        int c = (a+b)*10;

        return c;
    }

    public static void main(String[] args) {
        Math math = new Math();
        math.compute();
        // 底层会调用start0(),是一个本地方法(C++实现的private native void start0())
        new Thread().start(); 
        System.out.println("--------end--------");
    }

}

对代码进行反汇编:javap -c Math.class > math.txt

Compiled from "Math.java"
public class com.ww.sso.controller.Math {
  public static final int data;

  public static com.ww.sso.entity.UserEntity user;

  public com.ww.sso.controller.Math();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public int compute();
    Code:
       0: iconst_1                          // JVM指令码
       1: istore_1
       2: iconst_2
       3: istore_2
       4: iload_1
       5: iload_2
       6: iadd
       7: bipush        10
       9: imul
      10: istore_3
      11: iload_3
      12: ireturn

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class com/ww/sso/controller/Math
       3: dup
       4: invokespecial #3                  // Method "<init>":()V
       7: astore_1
       8: aload_1
       9: invokevirtual #4                  // Method compute:()I
      12: pop
      13: getstatic     #5                  // Field java/lang/System.out:Ljava/io/PrintStream;
      16: ldc           #6                  // String --------end--------
      18: invokevirtual #7                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      21: return

  static {};
    Code:
       0: new           #8                  // class com/ww/sso/entity/UserEntity
       3: dup
       4: invokespecial #9                  // Method com/ww/sso/entity/UserEntity."<init>":()V
       7: putstatic     #10                 // Field user:Lcom/ww/sso/entity/UserEntity;
      10: return
}
public class HeapTest {
    
    byte[] a = new byte[1024*100]; // 100KB
    
    public static void main(String args) throws InterruptedException {
        List<HeapTest> heapTestList = new ArrayList<>();
        while (true) {
            heapTestList.add(new HeapTest());
            Thread.sleep(5);
        }
    }
    
}

阿里巴巴Arthasicon-default.png?t=N7T8https://alibaba.github.io/arthas

public class ArthasTest {
    
    private static HashSet hashSet = new HashSet();
    
    private static void main(String args) {
        // 模拟CPU过高
        cpuHigh();
        // 模拟线程死锁
        deadThread();
        // 不断的想hashSet集合添加数据
        addHashSetThread();
    }

    private static void addHashSetThread() {
        new Thread(() -> {
            // 初始化常量
            int cnt = 0;
            while (true) {
                try {
                    hashSet.add("cnt"+cnt);
                    Thread.sleep(10000);
                    cnt++;
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    private static void deadThread() {
        new Thread(() -> {
            while (true) {
                
            }
        }).start();
    }

    private static void cpuHigh() {
        Object objA = new Object();
        Object objB = new Object();
        Thread threadA = new Thread(() -> {
            synchronized (objA) {
                System.out.println(Thread.currentThread() + "get objA");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get objB");
                synchronized (objB) {
                    System.out.println(Thread.currentThread() + "get objB");
                }
            }
            
        });

        Thread threadB = new Thread(() -> {
            synchronized (objB) {
                System.out.println(Thread.currentThread() + "get objB");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread() + "waiting get objA");
                synchronized (objA) {
                    System.out.println(Thread.currentThread() + "get objA");
                }
            }
        });
        
        threadA.start();
        threadB.start();
    }

}

jad xxx.xxx.ArthasTest 命令反编译线上代码。

ognl 命令可以查看线上系统变量的值,甚至可以修改变量的值。 

四、JVM优化

可达性分析算法

将“GC Roots”对象作为起点,从这些节点向下开始向下搜索引用对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象。 

GC Roots根节点:线程的本地变量、静态变量、本地方法栈的变量等等。

 

 案例分析

JVM参数设置:java -Xms3G -Xmx3G -Xss1M -XX:MetaspaceSize=512M

线程运行每秒产生60M对象,运行14s左右,eden区就满了,进行一次minor gc,触发对象动态年龄判断。

对象动态年龄判断

当前对象的survivor区域里(其中一块区域,放对象的那块s区),一批对象的总大小大于这块survivor区域内存大小的50%(-XX:TargetSurvivor可以指定),那么此时大于等于这批对象年龄最大值的对象,就可以直接进入老年代。例如survivor区域里现有一批对象,年龄1+年龄2+年龄n的多个对象总和超过survivor区域的50%,此时就把年龄n(含)以上的对象都放入老年代。这个规则希望那些可能是长期存活的对象尽早进入老年代。对象动态年龄判断机制一般在minor gc后出发

问:能否对JVM调优,让其几乎不进行full gc ? 

JVM参数设置:

java -Xms3G -Xmx3G -Xmn2G -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/962454.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

接口自动化测试 —— JMeter断言基本使用

断言 断言&#xff1a;就是让程序判断预期结果和实际结果是否一致 注意&#xff1a;请求发起成功了&#xff0c;不代表着一定符合预期的结果。 JMeter中常用断言 响应断言 JSON断言 持续时间断言 响应断言 步骤&#xff1a;&#xff1a;线程组——HTTP取样器——断言——…

VM装MACos

准备工具: 下载macOS Ventura 13 ISO镜像文件、VMware Workstation Pro最新版并激活(自行官网下载即可,需要镜像和key可以最下边的云盘自取) 下载Unlocker for VMware Workstation Pro,该工具用于解锁 macOS 系统支持、目前已支持macOS 13。 有需要的部分工具我放到最后 …

出行365 CTO张劲涛:智慧公路客运出行,数据库先行

&#x1f399;️&#x1f399;️《DB大咖说》第二期来啦&#xff01; 「DB大咖说」的第 2 期节目&#xff0c;我们邀请到的是盛威时代&#xff08;出行365&#xff09;CTO 张劲涛&#xff0c;在高铁、飞机如此发达的出行领域&#xff0c;他却深耕公路客运 11 年&#xff0c;他表…

利用 AI 赋能云安全,亚马逊云科技的安全技术创新服务不断赋能开发者

文章分享自亚马逊云科技 Community Builder&#xff1a;李少奕 2023年6月14日&#xff0c;一年一度的亚马逊云科技 re:Inforce 全球大会在美国安纳海姆落下了帷幕。re:Inforce 是亚马逊云科技全球最大的盛会之一&#xff0c;汇集了来自全球各地的安全专家&#xff0c;共同学习、…

2024郑州光伏展|郑州太阳能光伏展|郑州光伏储能技术展览会

2024第四届中国&#xff08;郑州&#xff09;太阳能光伏及储能产业展览会 时间&#xff1a;2024年2月26-28日 地点&#xff1a;郑州.中原国际博览中心 2024年&#xff0c;郑州将举办第四届中国&#xff08;郑州&#xff09;太阳能光伏及储能产业展览会&#xff0c;这是该领域…

endnote插入论文文献完整设置

最近要开题了&#xff0c;之前word写论文用的是交叉引用&#xff0c;比较麻烦&#xff0c;听说用endnote插入文献挺方便&#xff0c;于是上网查了一下使用的规则&#xff0c;记录一下一些基本的设置。 首先我们插入文献要注意使用相关的样式&#xff08;style&#xff09;&…

C语言左旋字符串详解(付完整代码)

目录 暴力求解 优雅求解 左旋字符串&#xff0c;实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 暴力求解 每左旋转1个字符串&#xff0c;旋转k次&#xff0c;这种方法效率比较低&#xff0c;因为…

六、vim编辑器的使用

1、编辑器 (1)编辑器就是一款软件。 (2)作用就是用来编辑文件&#xff0c;譬如编辑文字、编写代码。 (3)Windows中常用的编辑器&#xff0c;有自带的有记事本(notepad)&#xff0c;比较好用的notepad、VSCode等。 (4)Linux中常用的编辑器&#xff0c;自带的最古老的vi&…

进程管理死死的学

进程管理 文件属性 chattr【扩展】 chattr chattr i 文件名 # 添加权限 a 可追加&#xff0c;不可修改 i 只可查看 A 不修改访问时间 charrt -i 文件名 # 取消权限 -R 递归处理&#xff0c;将指令目录下的所有文件及子目录一并处理&#xff1b;lsattr 查看文件属性 lsattr …

具有高度的稳定性嵌入式ARM控制器BL304

嵌入式ARM控制器BL304系列是一款专为工业控制领域设计的坚固型工控设备。它采用NXP公司的处理器I.MX8M Mini四核64位处理器&#xff0c;搭配四核 Cortex-A53单核Cortex-M4构架&#xff0c;运行速度高达1.8GHz&#xff0c;具有高度的稳定性和可靠性。 处理器是嵌入式控制器的核心…

《Python趣味工具》——其他常见的RPG游戏梳理:

Hello&#xff0c;各位朋友们大家好&#xff01;昨天我们一起制作了自己的第一个RPG游戏——《人生选择模拟器》&#xff0c;是不是还意犹未尽呢&#xff1f;哈哈&#xff0c;今天我们再来尝试做几款比较轻量级的小游戏吧&#xff01; 文章目录 1. 猜单词游戏:2. 姻缘测试:3. …

高忆管理:大盘缩量震荡短期面临方向选择

大盘连续震荡格局&#xff0c;周四缩量小幅回调。 沪指当日低开震荡&#xff0c;盘中最低探至5日均线附近止跌&#xff0c;收盘跌幅有所收窄。深成指相同低开低走&#xff0c;盘中时刻短翻红后再度震荡回落。到收盘&#xff0c;沪指报收3119.88点&#xff0c;跌落0.55%&#x…

VScode远程连接主机

一、前期准备 1、Windows安装VSCode&#xff1b; 2、在VSCode中安装PHP Debug插件&#xff1b; 3、安装好Docker 4、在容器中安装Xdebug ①写一个展现phpinfo的php文件 <?php phpinfo(); ?>②在浏览器上打开该文件 ③复制所有信息丢到Xdebug: Installation instr…

骨传导耳机会影响听力吗?这是真的吗?

首先正常的使用骨传导耳机并不会影响我们的听力&#xff01;那是为什么呢&#xff1f;&#xff1f; 因为骨传导是一种声音传导方式&#xff0c;可以通过人的颅骨、骨迷路、内耳淋巴液传递、螺旋器、听神经、听觉中枢来传递声波。 相对于通过耳道声波的经典声音传导方式&#x…

Mysql批量插入大量数据的方法

使用存储过程进行插入&#xff0c; 在navicate中示例如下&#xff1a; 输入需要的参数点击完成 在begin end中输入代码&#xff0c;示例代码如下 CREATE DEFINERskip-grants userskip-grants host PROCEDURE batch_insert() BEGINdeclare i int default 0; set i0;while i<1…

探秘C语言扫雷游戏实现技巧

本篇博客会讲解&#xff0c;如何使用C语言实现扫雷小游戏。 0.思路及准备工作 使用2个二维数组mine和show&#xff0c;分别来存储雷的位置信息和排查出来的雷的信息&#xff0c;前者隐藏&#xff0c;后者展示给玩家。假设盘面大小是99&#xff0c;这2个二维数组都要开大一圈…

解码注意力Attention机制:从技术解析到PyTorch实战

目录 引言历史背景重要性 二、注意力机制基础概念定义组件 注意力机制的分类举例说明 三、注意力机制的数学模型基础数学表达式注意力函数计算权重 数学意义举例解析 四、注意力网络在NLP中的应用机器翻译代码示例 文本摘要代码示例 命名实体识别&#xff08;NER&#xff09;代…

通过starrocks jdbc外表查询sqlserver

1.sqlserver环境准备&#xff0c;使用docker环境&#xff0c;可以参考使用flink sqlserver cdc 同步数据到StarRocks_gongxiucheng的博客-CSDN博客 部署获得sqlserver环境&#xff1b; 2.获取starrocks环境&#xff0c;也可以通过docker部署&#xff0c;参考&#xff1a;使用…

openlayers-15-坐标添加带箭头的线

ol的官网示例中有绘制带箭头的线的demo&#xff0c;那个是交互式绘制&#xff0c;而不是根据经纬度坐标添加&#xff0c;在其基础上稍作修改&#xff0c;即可转为通过经纬度添加带箭头的线的功能&#xff0c;线和箭头的粗细大小样式都可以自定义 代码如下 <!DOCTYPE HTML P…

Mybatis 动态SQL – 使用if, where标签动态生成条件语句

前面几篇我们介绍了使用Mybatis进行数据的增删改查&#xff0c;并且也了解了如何在Mybatis中使用JDK的日志系统打印日志&#xff1b;本篇我们继续介绍如何使用Mybatis提供的if,where标签动态生成条件语句。 如果您对数据的增删改查和Mybatis集成JDK日志系统不太了解&#xff0…