首页 > 编程知识 正文

ulimit命令详解,ulimit命令找不到

时间:2023-05-05 15:09:05 阅读:154413 作者:2253

实际上很难有效地限制java。 许多池是无限制的,如果分配尝试失败,JVM将出现灾难性故障。 并非所有内存都已实际提交,但大部分内存已保留,因此计入ulimit施加的虚拟内存限制。

经过大量调查,我们发现使用了各种类型的内存java。 此答案适用于64位系统上的OpenJDK和Oracle 8.x。

这是JVM内存中最容易理解的部分。 是使用大部分程序存储器的地方。 可以使用-Xmx和-Xms选项进行控制。

元空间

它似乎包含有关加载的类的元数据。 无法确定该类是向操作系统释放内存,还是只是增长。 默认的最大值似乎是1g。 可以使用-XX:MaxMetaspaceSize选项控制。 请注意,如果不指定Compressed类区域,则可能不执行任何操作。

压缩类空间

这似乎与Metaspace有关。 我不知道这个类别是否会向操作系统释放内存,或者只是增长。 默认的最大值似乎是1g。 可以使用’- xx:compressedclasspacesize `选项进行控制。

垃圾收集器开销

根据所选的垃圾收集器,似乎有基于固定未结销售量和堆大小的附加分配。 据观察,此开销约为堆大小的5%。 除了选择不同的GC算法外,没有已知方法来限制此选项。

主题

每个线程在堆栈上确保1米。 JVM似乎保留了额外的50米内存作为防止堆栈溢出的安全措施。 可以使用-Xss选项控制堆栈大小。 无法控制安全大小。 由于无法强制执行最大线程数,且每个线程需要一定量的内存,因此此内存池在技术上是无限的。

Jar文件(和zip文件)。

缺省zip实现使用内存映射访问zip文件。 这意味着访问的每个jar文件和zip文件都进行了内存映射。 必须有等于文件大小总和的保留内存。 可以通过设置sun.zip.disableMemoryMapping系统属性禁用此行为。 -dsun.zip.disablemapping等

NIO Direct Buffers

使用allocateDirect创建的所有直接缓冲区都使用堆的堆外内存。 最高的NIO性能有直接的缓冲区,因此在很多框架中使用。

此池在技术上是无限的,因为JVM无法限制NIO缓冲区中允许的总内存量。

此外,对于访问缓冲区的每个线程,堆上的内存都是重复的。 详情请参照this。

分配给库的本地内存

如果使用本机库,则所有分配的内存都位于堆之外。 一些核心java库(如java.util.zip.ZipFile )也使用占用堆内存的本机库。

此池在技术上不受限制,因为JVM无法限制分配给主存储库的内存总量。

malloc体育场

JVM对许多本机内存请求使用malloc。 为了避免线程冲突问题,malloc函数使用多个预分配池。 默认池数量等于8 x cpu,但可以通过设置环境变量MALLOC_ARENAS_MAX复盖。 即使不使用全部,每个池也会保留一定量的内存。

对于java,通常建议将MALLOC_ARENAS_MAX设置为1-4。 由于最常见的分配是从堆中进行的,因此减少体育场的数量可以避免将不必要的虚拟内存计入ulimit。

虽然此类别在技术上不是自己的池,但它描述了附加内存的虚拟分配。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。