V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
4ra1n
V2EX  ›  Java

有没有什么思路对 Fat Jar 进行瘦身

  •  
  •   4ra1n · 1 天前 · 885 次点击
    考虑到反射或者懒加载等内容,我思路是这样的:

    1. 启动时挂一个 java agent 上去,内容是 hook 加载本地 jar 文件的方法
    2. 用户尝试自己需要的功能,例如注册/登录/管理后台等等,完全做一遍
    3. 然后看整个流程中 java agent 这边记录的,都加载了哪些 jar 文件
    4. 对比存在的 jar 得出一个可以删掉的 jar 列表

    请教下这个思路是否可行,以及我需要 hook 的类应该是哪些,或者有没有更好的思路
    6 条回复    2024-12-28 17:55:21 +08:00
    bunnyblueair
        1
    bunnyblueair  
       1 天前
    ProGuard
    4ra1n
        2
    4ra1n  
    OP
       1 天前
    ProGuard 主要是两个问题,第一个配置非常麻烦,不是容易上手的方式

    另外一个问题是,它应该是静态分析的引用关系,而不是动态决定的,比如反射问题,某些功能如果是运行时候决定是否调用某个类的,是无法处理的
    foolishcrab
        3
    foolishcrab  
       1 天前
    可行,不需要考虑对应用性能影响的时候这个是很简单的东西。
    叫 reachability analysis, native image 就有一个专门的 agent 来收集 runtime reflection metadata 之类的东西。

    其实这个方案最大的问题在于你帖子里的第二步,对于一个大型软件而言这是很难的,所以一般要在生产上挂着用真实流量收集,这样的话就需要考虑 agent 的性能影响。这里就不展开了
    sagaxu
        4
    sagaxu  
       23 小时 57 分钟前
    java --verbose:class 找出用到的所有 class 和 jar 包,删掉没用的 jar 包,甚至 jar 包内部删掉无用的 class
    chendy
        5
    chendy  
       22 小时 23 分钟前
    fat jat 解压开,依赖的 jar 包放某个共享目录
    所有项目挂在这个共享目录,然后配好 classpath
    比较丑陋,但是确实能用
    4ra1n
        6
    4ra1n  
    OP
       4 小时 18 分钟前
    已经实现了,大概是:

    capabilities.can_generate_all_class_hook_events = 1;
    (*jvmti)->AddCapabilities(jvmti, &capabilities);
    callbacks.ClassFileLoadHook = &ClassLoadHook;

    在 ClassLoadHook 函数中做收集

    java 启动参数 -agentpath:/path/to/agent.dll

    可以收集所有加载的 class 信息,动态地
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2833 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:13 · PVG 22:13 · LAX 06:13 · JFK 09:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.