JVM--对象访问和OutOfMemoryError异常】的更多相关文章

    对象访问: 使用句柄访问方式: 使用直接指针访问方式: OutOfMemoryError异常: 设置堆的最小最大容量:-Xms20m -Xmx20m 设置一样推不可自动扩展. 设置出现内存溢出时Dump出当前内存堆转储快照:-XX:+HeapDumpOnOutOfMemoryError. HotSpot虚拟机中不区分虚拟机栈和本地方法栈. 设置本地方法栈大小:-Xss128k. 设置方法区大小:-XX:PermSize=10M -XX:MaxPermSize=10M. 设置直接内存容量:…
Java堆中存放Object对象数据,例如new出来的Object.当没有任何引用指向某对象时,该对象可能被垃圾回收.有关垃圾回收算法,可参考其他有关文章,网上很多.关于对象引用,按强弱还有强引用,软引用,弱引用,虚引用之分.强引用,一般不会被垃圾回收,若内存不足,只好抛出OutOfMemoryError:软引用,垃圾回收器扫描时,若是内存不足的情况下,这种引用的对象会被回收.弱引用,只要垃圾回收器扫描,就会回收. 栈是动态的,每起一个线程就会起一个栈,每个线程中每个方法会在栈中起一个帧,称栈帧…
1.stackoverflow: 每当java程序启动一个新的线程时,java虚拟机会为他分配一个栈,java栈以帧为单位保持线程运行状态:当线程调用一个方法是,jvm压入一个新的栈帧到这个线程的栈中,只要这个方法还没返回,这个栈帧就存在. 如果方法的嵌套调用层次太多(如递归调用),随着java栈中的帧的增多,最终导致这个线程的栈中的所有栈帧的大小的总和大于-Xss设置的值,而产生生StackOverflowError溢出异常. 2.outofmemory: 2.1.栈内存溢出 java程序启动…
主要针对Java堆和方法区 1.判断对象是否已"死" Java堆中存放着几乎所有的对象实例,垃圾回收器在对堆进行回收之前,首先应该判断这些对象哪些还"存活",哪些已经"死亡". (1)引用计数法 A. 工作流程 给每个对象附加一个计数器,每当有一个地方引用此对象.计数器+1:每当有一个地方不再引用此对象,计数器-1:在任意时刻,只要对象引用计数器值为0,任务此对象已经"死亡".(没有"死亡"的对象一定不会被…
JVM运行时内存被划分成多个区域,而除了程序计数器之外,其他几个区都会出现OutOfMemoryError异常,主要原因就是对应内存区域的内存不足以再分配内存,一般要么是内存泄漏了要么就是内存参数设置的过小而导致.本文就在实际操作中模拟下JVM内存模型中各个区域出现内存溢出的场景. 1.堆内存溢出 先设置JVM启动参数,设置初始化堆内存大小为 -Xms15M  -Xmx15M 堆内存中主要存储对象实例,所以测试堆内存溢出就需要不断的创建对象实例,并且保证这些对象实例不被垃圾回收,测试代码如下 p…
在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有可能发生OutOfMemoryError(OOM)异常. 1.Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GCRoots到对象之间有可大路径来避免垃圾回收机制清理这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常. 执行代码前提:Java堆大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDum…
对象创建 类加载过后可以直接确定一个对象的大小 对象栈上分配是通过逃逸分析判定.标量替换实现的,即把不存在逃逸的对象拆散,将成员变量恢复到基本类型,直接在栈上创建若干个成员变量 选择哪种分配方式由Java堆是否规整决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理 功能决定.因此,在使用Serial.ParNew等带Compact过程的收集器时,系统采用的分配算法是指针碰撞,而使用 CMS这种基于Mark-Sweep算法的收集器时,通常采用空闲列表 空间并发分配解决方案 TLAB,…
学习jvm时看到几篇非常好的系列文章,转载了: <深入理解Java虚拟机>学习小记一之自动内存管理机制(一) http://my.oschina.net/linuxfelix/blog/128406 一.概要 我们可以带着以下几个问题去学习自动内存管理机制,罗列如下: 什么操作可能导致内存溢出? 有哪些种类的内存溢出? 都是在内存的哪些区域溢出?   二.运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,如下图所示 其中虚拟机栈.本地方法栈和…
参考:深入理解java虚拟机一书 开始之前,我们也应当搞清楚连个概念,内存泄漏Memory Leak 内存溢出: 内存泄漏:程序中间动态分配了内存,但是在程序结束时没有释放内存,造成这部分内存不可用.与硬件无关 而内存溢出就是我们接下来要讨论的: 这篇文章的目的主要有两个: 第一:验证Java虚拟机中各个运行区域存储的内容 第二:在遇到内存溢出时能快速的根据异常信息判断是哪个区域的内存溢出 1.java堆:java堆用于存储对象实例,对象数量达到最大堆溢出 2.虚拟机栈和本地方法栈:虚拟机栈主要…
剖析Java OutOfMemoryError异常 在JVM中,除了程序计数器外,虚拟机内存中的其他几个运行时区域都有发生OutOfMemoryError异常的可能,本篇就来深入剖析一下各个区域出现OOM异常的情形,以及如何解决各个区域的OOM问题. 本篇主要包括如下内容: Java堆溢出 运行时常量池和方法区溢出 本地内存溢出 Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免JVM清除这些对象,那么在对象数量到达最大堆的容量限制…