Arthas mc(Memory Compiler/内存编译器 )_Memory Compile


文章目录

  • 二、命令列表
  • 2.2 class/classloader相关命令
  • 2.2.2 mc (Memory Compiler/内存编译器 )
  • 举例1:可以通过-d命令指定输出目录:mc -d /temporary/tmp /temporary/tmp/AccountController.java
  • 举例2:通过`--classLoaderClass`参数指定 ClassLoader


二、命令列表

2.2 class/classloader相关命令

2.2.2 mc (Memory Compiler/内存编译器 )

提示:

Memory Compiler/内存编译器,编译.java文件生成.class

注意点1:mc 命令有可能失败。如果编译失败可以在本地编译好.class文件,再上传到服务器。具体参考retransform命令说明。

注意点2:编译生成.class文件之后,可以结合retransform命令实现热更新代码。

参数说明:

参数名称

参数说明

-c

指定 classloader

-d

指定输出目录

代码:

package com.hero.lte.ems.security.controller;

import com.hero.lte.ems.common.spring.SpringContextHolder;
import com.hero.lte.ems.db.orm.mybatis.Page;
import com.hero.lte.ems.security.config.Constants;
import com.hero.lte.ems.security.entity.*;
import com.hero.lte.ems.security.service.*;
import com.hero.lte.ems.security.util.UUIDGennerator;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.mgt.DefaultSessionKey;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO;
import org.apache.shiro.subject.Subject;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.io.Serializable;
import java.time.Clock;
import java.util.*;

@RestController
@RequestMapping("/lte/ems/user/")
public class AccountController {

    @Autowired
    private IAccountService accountService;
    @Autowired
    private IRoleService roleService;
    @Autowired
    private IAuthService authService;
    @Autowired
    private IRemindService remindService;
    @Autowired
    private IStrategyService strategyService;

    /**
     * 查询帐户分页列表
     * @param account
     * @param pager
     * @return
     */
    @RequestMapping(value = "query", method = RequestMethod.GET)
    public Page<Account> query(Account account, Page<Account> pager) {
        pager.setParam(account);
        return accountService.queryAccountPage(pager);
    }
举例1:可以通过-d命令指定输出目录:mc -d /temporary/tmp /temporary/tmp/AccountController.java

基本用法
mc -d 输出路径 置顶路径下的类

[arthas@24056]$ mc -d /temporary/tmp /temporary/tmp/AccountController.java 
Memory compiler output:
/temporary/tmp/com/hero/lte/ems/security/controller/AccountController.class
Affect(row-cnt:1) cost in 2682 ms.
[arthas@24056]$

执行命令前效果

Arthas mc(Memory Compiler/内存编译器 )_mc_02

执行命令后效果,按照包名com.hero.lte.ems.security.controller创建.class文件

Arthas mc(Memory Compiler/内存编译器 )_mc_03

举例2:通过--classLoaderClass参数指定 ClassLoader

基本用法

mc --classLoaderClass 全包名类名 置顶路径下的类 -d 指定输出路径

$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp
Memory compiler output:
/tmp/com/example/demo/arthas/user/UserController.class
Affect(row-cnt:1) cost in 346 ms