Dong_Da_JR 2023-11-17 11:38 采纳率: 100%
浏览 13
已结题

大附件加密后java虚拟机内存占用量居高不下

使用国密算法对大附件(附件大小1.3G)进行加密后,java虚拟机占用的内存一直居高不下。即便程序代码已经执行完成,过去1个多小时了,也还是不释放内存。俗话说的好,不懂就要问,请各位仁兄给看看要怎么解决。
代码片段如下:
1、各种变量的定义

img


2、加密部分代码:

img

3、内存占用情况代码:

img


请各位不吝赐教[抱拳]

  • 写回答

10条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-11-17 11:47
    关注

    引自强大而免费的微信小程序:皆我百晓生

    一、对于大附件的加密,可以按照以下步骤进行:

    1. 获取文件输入流:

    File inputFile = new File("path/to/large/file");
    InputStream inputStream = new FileInputStream(inputFile);
    

    2. 创建加密输出流:

    File outputFile = new File("path/to/encrypted/file");
    OutputStream outputStream = new FileOutputStream(outputFile);
    

    3. 分批读取和加密:

    byte[] buffer = new byte[bufferSize];
    int bytesRead;
    while ((bytesRead = inputStream.read(buffer)) != -1) {
        byte[] encryptedBytes = cipher.doFinal(buffer, 0, bytesRead);
        outputStream.write(encryptedBytes);
    }
    

    4. 关闭输入输出流:

    inputStream.close();
    outputStream.close();
    

    通过以上步骤,将大附件分批读取和加密,可以减少内存的占用量。

    二、确保资源关闭和释放:
    在代码中确保已经使用完毕的资源,如文件输入流和输出流,在不再使用时关闭和释放资源,以防止内存泄漏问题的出现。

    try {
        // 执行分批读取和加密的代码
    
    } finally {
        // 关闭输入输出流
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                // 处理关闭异常
            }
        }
        if (outputStream != null) {
            try {
                outputStream.close();
            } catch (IOException e) {
                // 处理关闭异常
            }
        }
    }
    

    三、使用垃圾回收机制:
    Java虚拟机具有垃圾回收机制,可以自动回收不再使用的内存。但有时候垃圾回收机制可能需要一定时间才能释放内存。可以使用以下方法来促进内存的及时回收:

    1. 显式调用System.gc():
    在加密操作完成后,在代码的合适位置显式调用System.gc(),可以通知垃圾回收机制进行内存回收。但请注意,这只是一个建议,具体的回收时机还是由垃圾回收机制决定。

    // 加密操作完成后
    System.gc();
    

    2. 调整堆内存大小:
    可以尝试调整Java虚拟机的堆内存大小,给予更多的内存供垃圾回收使用。可以通过设置-Xms和-Xmx选项来调整堆内存的初始大小和最大大小。

    java -Xms2g -Xmx4g YourProgram
    

    上述命令将初始堆大小设置为2GB,最大堆大小设置为4GB。根据实际情况调整堆内存的大小,以便更好地满足程序的需求。

    3. 使用Java虚拟机的可选参数:
    可以尝试使用Java虚拟机的其他可选参数来改善内存使用情况,如:

    -XX:+UseG1GC: 使用G1垃圾回收器,它可以更高效地处理大内存和高并发的情况。

    -XX:MaxGCPauseMillis: 设置最大垃圾回收停顿时间,可以控制垃圾回收的执行时间,从而减少内存占用。

    -XX:ParallelGCThreads: 设置并行垃圾回收的线程数,可以提高垃圾回收的效率。

    -XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio: 设置堆空闲空间的最大和最小比例,可以调整垃圾回收的触发时间和堆内存的使用情况。

    java -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:ParallelGCThreads=4 -XX:MaxHeapFreeRatio=70 -XX:MinHeapFreeRatio=40 YourProgram
    

    根据实际情况,可以尝试使用这些可选参数来优化垃圾回收和内存使用。

    总结:
    针对大附件加密后Java虚拟机内存占用量居高不下的问题,可以采取以下措施:

    1. 分批加密大附件,避免一次性加载整个附件到内存中。
    2. 确保资源的关闭和释放,避免内存泄漏问题。
    3. 使用垃圾回收机制,及时回收不再使用的内存。可以显式调用System.gc(),调整堆内存大小和使用Java虚拟机的可选参数来优化垃圾回收和内存使用情况。

    请注意,由于问题描述缺乏具体代码和环境信息,以上解决方法仅为一般性建议。具体解决方案可能需要根据实际情况进行调试和优化。建议你根据以上思路和方法,结合实际情况进行尝试和调整。如果问题仍然存在,请提供更多的代码和环境信息,以便更好地帮助你解决问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 11月25日
  • 已采纳回答 11月17日
  • 修改了问题 11月17日
  • 创建了问题 11月17日

悬赏问题

  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 关于大棚监测的pcb板设计
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用