之前在公司听了一门关于java
内存占用方面的讲座,收获颇丰,回来后在eclipse
下进行了一些简单的尝试,但是实验遇到了一些小小的问题,通过向大牛咨询和查资料的方式逐渐将这些问题解决了,现在将我在这些实验中遇到的问题,已经解决的方法和大家分享下,希望各位指点其中的错误,谢谢!
Java
环境:
Java
version "1.6.0_24"
Java(TM)
SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) Client VM (build
19.1-b02,mixed mode, sharing)
设置JVM
启动参数为 -Xms12m -Xmx12m
,然后运行如下程序:
public class MemTest {
public static void main(String[] args) {
int[] intArray = new int[2*1024*1024];
}
}
程序运行后出现:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at thread.ThreadCount.main(ThreadCount.java:6)
说明程序运行时堆内存溢出。
存在疑问:
在java
中,每个int
占4
字节,这个int
数组共有2*1024*1024
个int
类型,那我们可以推断出这个int
数据占据了大约8M
,而且这些空间是在内存堆中开辟的。现在我们已设置好内存堆有12M
的空间,也就是说除去程序其他内存堆开销整个堆内存应该剩下将近4m
,但是此处运行后,程序发生内存堆不够的内存溢出。
疑问解答:
之所以遇到上面的问题是因为我们所使用的Java
HotSpot(TM)
虚拟机是一种分代式的结构,其主要结构如下所示:
此种类型的GC
堆分成了三代,分别是Young Generation
、Old Generation
(Tenured
)、Permanent Generation
。
其中Young Generation
由Eden
、S0
、S1
(就是图上说的survivor
和spaces
区)组成,它主要负责存放新生成的对象,当Eden
区满时,还存活的对象被复制到S0
,当S0
满时,复制到S1
,当S1
满时将从S0
复制过来的且存活的对象复制到Old Generation
。其中S0
和S1
两个区是对称的,没有先后关系,一个S
区中可能存在着从Eden
或是另一个S
区复制过来的对象,而只有从另一个S
区复制过来的数据才能继续复制到老年区。而
而Old Generation
区中存放的从Young
区复制来的存活对象,都是生命周期较长的对象。
另外,Permanent Generation
对应着JVM
规范中的方法区,主要存放一些静态成员、常量,在HotPot VM
中可使用-XX:PermSize
–XX:MaxPermSize
对此区域进行调节。
在试验中新建的intArray
数组,需要连续的内存空间存储且一个对象不能跨代存储,也就是说,我们新建的对象大小不能超过了GC
堆中空间最大的一代,一般情况下,最大的代是Old Generation
,因此当intArray
数组对象为8M
时,可能已经超过了Old Generation
的大小,所以发生内存溢出异常。
了解完HotSpot
的构造后,我们来看看为什么之前的代码会发生内存溢出。这个因为在试验中新建的intArray
数组,需要连续的内存空间存储且一个对象不能跨代存储,也就是说,我们新建的对象大小不能超过了GC
堆中空间最大的一代,一般情况下,最大的代是Old Generation
,因此当intArray
数组对象为8M
时,已经超过了Old Generation
的大小,所以发生内存溢出异常。
- 大小: 23.6 KB
分享到:
相关推荐
《系统内存统计使用》实验报告
实验一 使用 Java 开发环境 Myeclipse 和 1 实验二 Java 结构化程序设计应用 3 实验三 Java 数组和方法应用 10 实验四 类和对象;类的继承和派生;多态性;接口;构造器应用 16 实验五 Java访问控制管理;封装类;...
使用java来实现模拟的内存管理 有分配内存 回收内存等功能 有可视化效果 可以很清楚的看到内存的分配情况
操作系统模拟内存分配实验报告
实验目的:综合运用Java语言和面向对象技术开发一个小型软件系统 实验内容: 1. 已经提供的原始数据:班级成绩单文件 该文件为文本文件,存储某个班的所有学生某门课程的成绩。 例如:2012级计算机科学与技术8班-...
开发环境Manjaro-Deepin下的Intellij IDEA ultimate edition 2020.1.1-1,编译链接直接点击运行即可,实验中使用的jdk版本为1.8。调试过程也是通过idea进行的。 这次实验基本上是在给定的框架之下实现指定的功能,...
假定系统的内存共640K,初始状态为操作系统本身占用64K。在t1时间之后,有作业A、B、C、D分别请求8K、16K、64K、124K的内存空间:在t2时间之后,作业C完成;在t3时间之后,作业E请求5K的内存空间;在t4时间之后,作业D完成。...
此代码是本人原创,模拟最差适应算法实现的动态内存管理,java语言版。
JAVA内存占用分析:查找程序代码资源未释放问题 JAVACPU占用分析:垃圾回收占用内存问题
用Java语言实现《操作系统》课程中“动态内存分配”实验的设计,采用首次使用算法(FIrst Fit)。
JAVA版综合性实验学生成绩分析程序源码 1.1 题目介绍 综合运用Java语言和面向对象技术开发一个小型软件系统:学生成绩分析程序,该程序支持 文本文件成绩单和对象文件成绩单,其中文本文件成绩单每行存储一个...
实验目的:综合运用Java语言和面向对象技术开发一个小型软件系统 实验内容: 1. 已经提供的原始数据:班级成绩单文件 该文件为文本文件,存储某个班的所有学生某门课程的成绩。 例如:2012级计算机科学与技术8班-...
如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应分配时间片给就绪队列中排...
命令行: java -XX:+PrintCommandLineFlags -version 查看jvm默认参数 分别是 -XX:+UseCompressedOops 和 -XX:+UseCompressedClassPointers 这2个参数都是默认开启(+代表开启,-代表关闭) UseCompressedOops:普通...
这是一个NetBeans 8 Java项目,展示了... 如果您只是想了解OpenCV Java内存管理的工作原理,请跳过以下项目。 已安装Java(我使用了Oracle JDK 8,Ubuntu,X86_64) 已安装Ant(用于OpenCV构建) 您需要安装OpenCV依赖
1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境:windows 7/8/10 1...
课设项目基于Java可视化仿真实现Linux2.6进程管理与内存管理源码+项目说明+实验报告.zip 1、该资源内项目代码都是经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科...
计算机操作系统课程设计-基于Java实现的可视化仿真实现Linux2.6进程管理与内存管理+源代码+文档说明+实验报告 可视化仿真实现Linux2.6进程管理与内存管理,计算机操作系统课程设计 摘要 为了检验自己的操作系统课程...
使用统一的测试文档集合、统一的搜索测试案例对代码进行功能测试,构建好的索引和基于统一的搜索测试案例的检索结果最后输出到文本文件里作为实验报告附件提交。 本实验只需要基于控制台实现,实验报告里需要提供...
·课程共30天,715个知识视频小节,涉及主流Java使用的方方面面,全而不冗余 ·全程内容涵盖数据结构、设计模式、JVM内存结构等深度技术 ·企业级笔试面试题目深入源码级讲解,拒绝死记硬背 4.代码量更大、案例更...