当前位置: 首页 > news >正文

Java虚拟机支持的最大内存限制

最近在开发Java的程序。本来我是一直很喜欢Java的内存管理的,不需要担心分配内存,只管分配,垃圾收集器自己会给你回收内存的。现在开发的程序数据量很大,为了速度快,我准备把所有的信息加载进内存,这样可以保证快速响应。我还在反复算内存,想想自己的数据量,现在刚开始的时候应该够了(我的机器是4G内存,虽然Windows就认3.5G,但是比起我现在的数据量应该没问题)。

  没想到第一个实验的程序,跑了几个小时,就遇到了Out of Memory Exception了。看看自己的虚拟机设置,我设置的是-Xms512M -Xmx1024M。想都没想,直接改成-Xms512M -Xmx2048M,结果直接就Could not reserve enough space for object heap。程序都起不来了。这才发现原来最大内存还有限制。上网搜了一下,发现很多讨论这个问题的文章。最终在BEA的DEV2DEV论坛发现了最有用的 一篇

  这里的版主YuLimin 做了测试,得出结论:

  公司 JVM版本                  最大内存(兆)client    最大内存(兆)server

  SUN 1.5.x                          1492                            1520

  SUN 1.5.5(Linux)             2634                            2660

  SUN 1.4.2                          1564                            1564

  SUN 1.4.2(Linux)             1900                            1260

  IBM 1.4.2(Linux)             2047                             N/A

  BEA JRockit 1.5 (U3)      1909                             1902

  我现在用的是JDK1.6. 0_05,测试了一下。在Client状态下最大是,我的JDK不认-Server参数,测试不了Server状态。估计差不多。

  SUN 1.6.0                          1442                           N/a

  看样子用Java想用大内存也是不可能的了。而且一般的说法是内存太大了,垃圾收集的时间就会长。这也可以理解,一般是内存不够用了才收集的,扫描2G内存比1G当然要慢多了,而且内存对象多了,估计关系是指数上升的。

  下面附上YuLimin的测试方法和测试记录。

  测试方法:在命令行下用 java -XmxXXXXM -version 命令来进行测试,然后逐渐的增大XXXX的值,如果执行正常就表示指定的内存大小可用,否则会打印错误信息。

 

 

  • 堆(Heap)和非堆(Non-heap)内存
    按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。
  • 堆内存分配
    JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由 -Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆 直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。
  • 非堆内存分配
    JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
  • JVM内存限制(最大值)
    首先JVM内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限 大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是 2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

     

    所以说设置VM参数导致程序无法启动主要有以下几种原因:

    1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;

    2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,比如当前操作系统最大内存限制,或者实际的物理内存等等。说到实际物理 内存这里需要说明一点的是,如果你的内存是1024MB,但实际系统中用到的并不可能是1024MB,因为有一部分被硬件占用了。

 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/3703290.html如需转载请自行联系原作者


demoblog

相关文章:

  • protobuf编码规则
  • Azure Web应用中设置静态虚拟目录的方法(比如部署Django需要用到)
  • Java左右补齐字符长度
  • Samba服务器搭建
  • linux 安装php
  • 算法导论
  • 走近复杂数据库计算型软件的设计与制作(3)—视图的设计
  • fstrict-aliasing
  • mybatis-入门
  • iptables入门 (取自鸟哥的Linux私房菜)
  • Linux(CentOS)安装rar和unrar以及rar和unrar命令的使用
  • Android滑动菜单框架完全解析,教你如何一分钟实现滑动菜单特效
  • 如何解决双显示器显示B/S架构软件的问题
  • c++中将_TCHAR转为string
  • 入门到放弃node系列之Hello Word篇
  • [译]CSS 居中(Center)方法大合集
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • cookie和session
  • ES6 ...操作符
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaScript函数式编程(一)
  • Java到底能干嘛?
  • js数组之filter
  • Linux中的硬链接与软链接
  • nodejs调试方法
  • Vue.js-Day01
  • 阿里云购买磁盘后挂载
  • 初识 webpack
  • 你真的知道 == 和 equals 的区别吗?
  • 做一名精致的JavaScripter 01:JavaScript简介
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 如何正确理解,内页权重高于首页?
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​2020 年大前端技术趋势解读
  • ​用户画像从0到100的构建思路
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #laravel 通过手动安装依赖PHPExcel#
  • #微信小程序(布局、渲染层基础知识)
  • $jQuery 重写Alert样式方法
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (3)llvm ir转换过程
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (三分钟)速览传统边缘检测算子
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)大型网站的系统架构
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core 通过 Ef Core 操作 Mysql
  • .NET Core 中插件式开发实现
  • .net core控制台应用程序初识
  • .NET/C# 的字符串暂存池
  • //解决validator验证插件多个name相同只验证第一的问题