• 一次对JDK进行"减肥"的记录


    图片来源于网络

    起因

    最近做的一个小项目,因为要涉及到批量部署,每次在部署之前都需要在各个主机上先安装jdk环境(为了使用jdk自带的工具如jps等,所以没有单纯安装jre),但是因为jdk文件太大(以jdk-8u161-linux-x64.tar.gz文件为例,大小为:189.8 MB),每次花费在文件拷贝上的时间都比较多,特别是需要大批量部署的时候总共需要消耗的时间还是比较可观的.因此就突发奇想:是否可以对jdk进行"廋身"呢?毕竟并非JDK中所有的Java类都需要用到,可以将那些不需要的Java类文件以及一些文档性的东西删除掉.于是在google了一下,已经有人这么干过了,参考: https://blog.csdn.net/xuweilinjijis/article/details/77527117 jdk1.8运行环境精简瘦身

    我的实践

    我根据搜索到的资料,结合自身的实际需求,以满足程序能够正常运行的最低需求,对jdk-8u161-linux-x64.tar.gz进行了相应的精简,最后成功将jdk安装包从"189.8 MB"精简到"49.6 MB".
    JDK8精简结果对比
    如下是对JDK进行精简实践的具体步骤:

    删除运行程序并不需要的文档文件及目录

    jdk1.8.0_161/javafx-src.zip
    jdk1.8.0_161/src.zip
    jdk1.8.0_161/man
    jdk1.8.0_161/db

    上述文件为文档性文件,在运行程序时并不需要,可以直接删除掉.

    删除运行程序并不需要的jar包,文件及目录

    jdk1.8.0_161/lib/missioncontrol
    jdk1.8.0_161/lib/visualvm
    jdk1.8.0_161/lib/ant-javafx.jar
    jdk1.8.0_161/lib/javafx-mx.jar
    jdk1.8.0_161/lib/jconsole.jar
    jdk1.8.0_161/jre/lib/amd64/libawt_xawt.so
    jdk1.8.0_161/jre/lib/amd64/libjavafx_font_freetype.so
    jdk1.8.0_161/jre/lib/amd64/libjavafx_font_pango.so
    jdk1.8.0_161/jre/lib/amd64/libjavafx_font.so
    jdk1.8.0_161/jre/lib/amd64/libjavafx_font_t2k.so
    jdk1.8.0_161/jre/lib/amd64/libjavafx_iio.so
    jdk1.8.0_161/jre/lib/amd64/libjfxwebkit.so
    jdk1.8.0_161/jre/lib/desktop
    jdk1.8.0_161/jre/lib/ext/jfxrt.jar
    jdk1.8.0_161/jre/lib/fonts
    jdk1.8.0_161/jre/lib/locale/de
    jdk1.8.0_161/jre/lib/locale/fr
    jdk1.8.0_161/jre/lib/locale/it
    jdk1.8.0_161/jre/lib/locale/ja
    jdk1.8.0_161/jre/lib/locale/ko
    jdk1.8.0_161/jre/lib/locale/ko.UTF-8
    jdk1.8.0_161/jre/lib/locale/pt_BR
    jdk1.8.0_161/jre/lib/locale/sv
    jdk1.8.0_161/jre/lib/locale/zh_HK.BIG5HK
    jdk1.8.0_161/jre/lib/locale/zh_TW
    jdk1.8.0_161/jre/lib/locale/zh_TW.BIG5
    jdk1.8.0_161/jre/lib/oblique-fonts
    jdk1.8.0_161/jre/lib/deploy.jar
    jdk1.8.0_161/jre/lib/locale/

    删除jar包中不需要的Java类包

    jdk1.8.0_161/jre/lib/charsets.jar/sun/awt
    jdk1.8.0_161/jre/lib/resources.jar/javax/swing
    jdk1.8.0_161/jre/lib/rt.jar/com/sun/awt
    jdk1.8.0_161/jre/lib/rt.jar/com/sun/java/swing
    jdk1.8.0_161/jre/lib/rt.jar/com/sun/swing
    jdk1.8.0_161/jre/lib/rt.jar/java/applet
    jdk1.8.0_161/jre/lib/rt.jar/java/awt
    jdk1.8.0_161/jre/lib/rt.jar/javax/swing
    jdk1.8.0_161/jre/lib/rt.jar/sun/applet
    jdk1.8.0_161/jre/lib/rt.jar/sun/awt
    jdk1.8.0_161/jre/lib/rt.jar/sun/java2d
    jdk1.8.0_161/jre/lib/rt.jar/sun/swing

    总结

    这个JDK精简的实现并不涉及任何技术难点,也并非必要.在我自己的实际场景中是因为触及到需要大量拷贝JDK文件导致消耗时间太长这个痛点了,所以才考虑这么做.另外,虽然我需要对程序进行批量部署,但是由于程序很简单,并未使用比较复杂的自动化部署工具,如:Ansible,Puppet等等,而是仅仅通过一个shell脚本进行自动化拷贝和部署.所以,当我在自己实现这个自动化部署工具的时候才真正感受到大文件拷贝消耗的时间成本.

  • 相关阅读:
    jmeter如何引用自己编写的java文件编译的jar包
    Vue+Django REST framework 打造生鲜电商项目(学习笔记二)
    mysql笔试题
    面试遇到的问题
    Idea中maven项目pom文件中已引入testng但项目文件中无法引入@Test
    记录一次TestNg+MyBatis中的SqlSession出现的问题,问题虽然解决了但尚未明白问题原因
    PyMySQL的基本操作
    MySQL循环语句
    Vue父子组件和非父子组件间的通信
    Python的静态方法和类成员方法
  • 原文地址:https://www.cnblogs.com/nuccch/p/10514180.html
Copyright © 2020-2023  润新知