如何鉴定是Java Break Memory不足的问题

很多使用 IBM Java 虚拟机的用户常常有这样一个疑问:我的程序是应该用 32 位 JVM,还是选择 64 位 JVM?

我们知道 , 和 64 位 JVM 相比,32 位 JVM 具有如下优点:

启动速度快 运行速度快 对
同一应用而言,占用的系统资源少

显而易见 , 32 位 JVM 是用户的首选。但是 , 采用 32 位寻址 , 32 位 JVM 的可用的">内存空间远比 64 位的小得多 , 所以有些时候用户不得不使用 64 位 JVM。用户常会问这样的问题 : 我的 Java 作业究竟需要多少内存 ?

要回答这一问题,首先要弄清楚 Java 作业的内存结构。Java 应用程序运行时占用的内存包括两部分:Java Heap 和 Break Memory。 相比较而言,Java Heap 是一个熟悉的术语,它是指对为 Java Object 所准备的空间, 这些 Java Object 会由 JVM 的垃圾回收机制所管理。Break Memory 也是 JVM 内存方面的一个术语 。

本文主要讨论 Break Memory,同时介绍 IBM i 上 JVM 的内存分配模型以及如何判断问题是 Break Memory 上的 OutOfMemory。

什么是 Break memory

相对 Heap Memory 而言,Break Memory 又叫内部内存或私有内存 . Break Memory 是在 JVM 中通过 malloc 方式申请的空间 , 具体来说 , 它由如下几个部分使用 :

Thread Stacks JVM 的
C++/C++ 代码 用户的 820.html">Native 函数代码及 Pase 的 Native 函数

为了更好的理解内存结构 , 下面给出了 32bit 内存空间图表 ( 表 1):

在这个图表中可以看到 , 程序的内存被分成 16 个分区 , 每个分区是 256M, 这样一个程序共占用 256*16 = 4G 空间。程序内存的这种布局有如下特性 :

有几个内存分区是被预先安排为其他用途 , 这几个分区是不能作为 Java Heap 或 Break Memory 使用的。 Heap Memory 和 Break Memory 使用的空间总额是固定的 , 它们共同占用这些区间 . 在表 1 上 , 从 0x3 到 0xC 是 Break Memory 和 Heap Memory 的空间 . Break Memory 从 0x3 分区开始分配空间 , 而从 0xC 分区按照分区反方向预先保留出来内存空间将留给 Heap Memory 使用 . Heap Memory 预先保留占用的分区越多 , Break Memory 能使用的分区就越少 , 反之亦然 . 当一个分区其中的任何一部分用做 Heap Memory,则整个分区都将保留下来做这个特定用途使用 , Break Memory 不能再使用这一分区。 在 JVM 启动的时候 , 可以设定为 Heap Memory 所保留的最大内存空间(-Xmx), 默认是 2GB。

很多时候 , 程序并没有设定 Heap Memory 大小 . 在这种默认情况下 , 内存的分配布局是 :

Heap Memory 占用 8 个分区 , 2048M. (2048 / 256 = 8) 为运行 JVM 有 6 个内存分区做其它方面的用途 , 包括内核 , 应用程序文本 , 栈数据 , 共享类库文本 , 等等 . 剩下 2 个内存分区留给 Break Memory: (16 total) - (8 heap) - (6 reserved) = 2

另一种常见的情况是设定 Heap Memory 最大为 1500M, 此时 :

Heap Memory 一共占用 6 个分区 , (1500 / 256 = 5.8) 同上面一样 , 有 6 个内存分区做其它方面的用途 剩下 4 个分区 (1024 MB) 留给 Break 内存

图 1. 标准模式

除了上面这种内存结构模式外 , 在一些特别的场景 , JVM 会采用另外两种内存模式 : 大内存模式及超大内存模式 ( 如下图 ).

当指定 Heap Memory 最大内存空间(-Xmx)小于或等于 2304M ( 2304/256 = 9 即 9 个分区 ) 时 , 内存模型将采用标准模式 ; 当指定的 Heap Memory 最大内存空间大于 2304M 而小于等于 3072M( 3072/256 = 12 即 12 个分区 ) 时 , 大 Heap Memory 模式将被使用 . 此时 ( 表 2) Heap Memory 占用分区多于 9 个 ( >2304M ). 除了固定占用 0x7 到 0xF 分区外 , Heap Memory 还和 Break Memory 分享从 0x3 到 0x6 的分区 . 当指定的 Heap Memory 最大内存空间大于 3072M 时 , Heap Memory 独占从 0x3 到 0xF 的 13 个分区的空间 , 此时 Heap Memory 已经达到 32 位 JVM 的内存上限 , 即 3328M. Break Memory 和主线程栈共同时用 0x2 分区 .

时间: 2024-09-27 17:45:35

如何鉴定是Java Break Memory不足的问题的相关文章

IBM i 上 Java Break Memory 介绍与问题分析

引言 很多使用 IBM Java 虚拟机的用户常常有这样一个疑问:我的程序是应该用 32 位 JVM,还是选择 64 位 JVM? 我们知道 ,  和 64 位 JVM 相比,32 位 JVM 具有如下优点: 启动速度快 运行速度快 对同一应用而言,占用的系统资源少 显而易见 , 32 位 JVM 是用户的首选.但是 , 采用 32 位寻址 , 32 位 JVM 的可用的内存空间远比 64 位的小得多 , 所以有些时候用户不得不使用 64 位 JVM.用户常会问这样的问题 : 我的 Java 作

java break语句的使用方法

在switch语中,break语句用来终止switch语句的执行.使程序 switch语句后的第一个语句 开始执行. 在Java中,可以为每个代码块加一个括号,一个代码块通常 用大括号{}括起来的一段 代码.加标号的格式 break语句有两种形式:无标签和有标签.无标签的break语句用来跳出单层switch.for.while.or do-while 循环,而有标签的break语句则用来跳出嵌套的switch.for.while.or do-while语句. BlockLabel:{codeB

java break 语句的方法

可用break和continue控制循环的流程.其中,break用于强行退出循环,不执行循环中剩余的语句,break语句是用于循环体中,他可以根据用户条件进行跳出循环哦,下面来一个实例 public class MainClass {   public static void main(String[] args) {     int i = 0;     while (true) {         System.out.println(i);         i++;         if

Java中的break和continue关键字的使用方法总结_java

一.作用和区别   break的作用是跳出当前循环块(for.while.do while)或程序块(switch).在循环块中的作用是跳出当前正在循环的循环体.在程序块中的作用是中断和下一个case条件的比较.   continue用于结束循环体中其后语句的执行,并跳回循环程序块的开头执行下一次循环,而不是立刻循环体.  二.其他用途   break和continue可以配合语句标签使用. 这个都很简单,下面给个综合实例,看看就明白 了: /** * Created by IntelliJ I

java中break和continue源码解析_java

在自己学习java语言的过程中,很容易把break和continue的用法混淆.为了便于以后快速查阅及温习,在此特留学习笔记一份.简述在任何迭代语句的主体部分,都可以用break和continue控制循环的流程.其中,break用于强行退出循环,不执行循环中剩余的语句.而continue则停止执行当前迭代,然后退回循环起始处,开始下一次迭代. 源码下面这个程序向大家展示了break和continue在for和while循环中的例子: package com.mufeng.thefourthcha

java outofmemory-java outof memory错误

问题描述 java outof memory错误 跑android测试程序总是报java outofmemory错误,求解答 解决方案 贴代码出来看看,一般都是图片的问题

【JAVA大数训练】How Many Fibs?

How Many Fibs? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3628    Accepted Submission(s): 1457 Problem Description Recall the definition of the Fibonacci numbers: f1 := 1 f2 := 2 fn := fn-

break 语句

语句   中断当前循环,或和 label 一起使用,中断相关联的语句. break [label]; 可选的 label 参数指定断点处语句的标签. 说明 通常在 switch 语句和 while.for.for...in.或 do...while 循环中使用 break 语句. 最一般的是在 switch 语句中使用 label 参数,但它可在任何语句中使用,无论是简单语句还是复合语句. 执行 break 语句会退出当前循环或语句,并开始脚本执行紧接着的语句. 示例 下面的示例说明了 brea

Oracle内存结构(三)----Process Memory的详细信息

oracle The Process Memory: 除了SGA(System Global Area)之外,Oracle进程还使用下面三个全局区: The Process Global Area  (PGA) The User Global Area   (UGA) The Call Global Area   (CGA)   很多人都搞不清楚PGA和UGA两者之间的区别,实际上两者之间的区别跟一个进程和一个会话之间的区别是类似的.尽管说进程和会话之间一般都是一对一的关系,但实际上比这个更复杂