【3】JVM-OutOfMemory异常重现】的更多相关文章

问题描述: 使用阿里云oss .net sdk 2.2版本,使用putobject接口上传文件时,抛出outofmemory异常. 原因分析: 上传时,用于准备上传的数据缓冲区内存分配失败.与应用软件可使用的内存有关,通过查看Visual Studio编译选项,虽然采用anycpu方式编译,但在2015版本中新增了“首选32平台”的勾选框,并设置为默认勾选,因此运行的应用依旧为32位版本,导致无法使用系统中充裕的内存资源. 解决方案: 1.取消“首选32平台”的勾选: 2.不适用anycpu,直…
Java虚拟机运行时数据区 在Java虚拟机规范的描述中,除了程序计数器之外,虚拟机内存的其他几个运行时区域都会发生OutOfMemory异常的可能. 我们可以在IDE(如IDEA)中设置虚拟机启动参数 1.Java堆溢出: Java堆用于存储对象的实例,只要不断的创建对象,并且保证GC Roots到这些对象之间有可达路径来避免垃圾回收机制来清除这些对象,那么在对象数量到达最大堆容量限制后就会产生内存溢出. 以下代码限制Java堆的大小是20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xm…
前言 JVM系列文章如无特殊说明,一些特性均是基于Hot Spot虚拟机和JDK1.8版本讲述. 下面这张图我想对于每个学习Java的人来说再熟悉不过了,这就是整个JDK的关系图: 从上图我们可以看到,Java Virtual Machine位于最底层,所有的Java应用都是基于JVM来运行的,所以学习JVM对任何一个想要深入了解Java的人是必不可少的. Java的口号是:Write once,run anywhere(一次编写,到处运行).之所以能实现这个口号的原因就是因为JVM的存在,JV…
Java Web程序由于引入大量第三方java类库,在启动时经常会遇到内存溢出(Memory Overflow)或者内存泄漏(Memory leak)问题,导致程序启动失败. 一.OOM异常分类: OOM异常主要分为java堆溢出.虚拟机栈和本地方法栈溢出.方法区和运行时常量池溢出.本地直接内存溢出. 1. java堆溢出 java堆用于存储对象实例,只要不断的创建实例,并且GC来不及清除这些对象,那么在对象数量达到最大堆的容量后就会产生内存溢出异常.当java堆异常出现时异常栈信息"java.…
JVM中常见的OOM,那么如何通过自己编写代码产生这些OOM异常呢?通过写代码重现异常,是为了避免在工作中写出有OOM BUG的代码.之前虽然看过相关文章,但是没自己写过这些代码,这次在编写的实际过程中,由于和书本使用的JDK版本不一致,也会有点问题.其中印象最深刻的就是从JDK1.7开始常量池就已经不放在方法区了,而是改到了Java堆中,所以<深入理解JAVA虚拟机>中的有些知识也需要更新了.下面的代码基于JDK1.7来的.并且在运行程序的时候需要设置JVM参数,如果不设置,轻则需要等待很长…
任何程序都追求正确有效的运行,除了保证我们代码尽可能的少出错之外,我们还要考虑如何有效的处理异常,一个良好的异常框架对于系统来说是至关重要的.最近在采集框架的时候系统的了解一边,收获颇多,特此记录相关的理论. 1 .异常体系简介: 异常是指由于各种不期而至的情况,导致程序中断运行的一种指令流,如:文件找不到.非法参数.网络超时等.为了保证正序正常运行,在设计程序时必须考虑到各种异常情况,并正确的对异常进行处理.异常也是一种对象,java当中定义了许多异常类,并且定义了基类java.lang.Th…
现象: 在表上面新建主键报ORA-08102的异常: SQL> alter table t add primary key(id); alter table t add primary key(id) * ERROR at line 1: ORA-00604: error occurred at recursive SQL level 1 ORA-08102: index key not found, obj# 52, file 1, block 72661 (2) 重现异常: 1.查看基表CO…
出处:  https://mp.weixin.qq.com/s/8j8YTcr2qhVActLGzOqe7Q  https://blog.csdn.net/h2604396739/article/details/91441248 先分析一道面试题 JVM 堆内存溢出后,其他线程是否可继续工作? 答:这道题其实很有难度,涉及的知识点有jvm内存分配.作用域.gc等,不是简单的是与否的问题. 由于题目中给出的OOM,java中OOM又分很多类型:比如:堆溢出(“java.lang.OutOfMemo…
在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有可能发生OutOfMemoryError(OOM)异常. 1.Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GCRoots到对象之间有可大路径来避免垃圾回收机制清理这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常. 执行代码前提:Java堆大小为20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),通过参数-XX:+HeapDum…
以下都是初步理解: 这主要是JVM内存配置的问题,网上有很多参考资料,但是我们不能死板硬套,必须根据自己工程的实际情况配置相关的参数. 1.按照jvm的设计规则,JVM内存分为堆(Heap)和非堆(Non-heap)内存 "Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时创建的.","在JVM中堆之外的内存称为非堆内存(Non-heap memory)".可以看出JVM主要管理两种类型的内存:堆和非堆…
-Xms1200m -Xmx1200m -XX:PermSize=64M-XX:MaxPermSize=256m-XX:ReservedCodeCacheSize=48m-Dcom.sun.management.jmxremote=true…
           Day01 1.基本数据类型各占几个字节 Byte 1 short2 int4 long8 float4 double6 char2 boolean1 Byte b1=3,b2=4; B=b1+b2; 错误 因为他们最终需要向上转型int类型 B2=3+4;正确 因为他们都是常亮 可以直接识别为byte 算数运算符 + 用于字符串拼接 或者数字相加 赋值运算符+= = *= %=          Day03 Day21 1.Break 和continue 的区别 Brea…
JVM处理异常 异常处理的两大组成要素是抛出异常和捕获异常.这两大要素共同实现程序控制流的非正常转移. 抛出异常可分为显式和隐式两种.显式抛异常的主体是应用程序,指的是在程序中使用throw关键字,手动将异常实例抛出. 隐式抛异常的主体则是Java虚拟机,它指的是Java虚拟机在执行过程中,碰到无法继续执行的异常状态,自动抛出异常. 捕获异常则涉及三个代码块: 1.try代码块: 用来标记需要进行异常监控的代码 2.catch代码块: try代码块之后,用以捕获try中触发的某种指定类型的异常.…
Xms : 是指设定程序启动时占用内存大小.一般该值设置大的会使程序启动快,但是可能会使本机暂时变慢. Xmx : 是指设定程序运行期间最大可占用的内存大小,如果程序运行需要占用更多的内存,超出这个 设置值,就会抛出OutOfMemory异常. Xss : 是指设定每个线程的堆栈大小.这个就要依据你的程序,看一个线程大约需要占用多少内存,可能会有多个线程同时运行等. 以上三个参数的设置都是默认以Byte为单位的,也可以在数字后面添加[k/m]代表kb或mb.不过设定的值不能超过机器本身内存大小,…
jvm,作为java平台通用性的实现基础,重要性不言而喻. 1.开发新项目,写运行脚本时要运用相关知识,确定jvm参数 2.维护老项目,需要对jvm进行性能调优 jvm内存划分: 1.程序计数器 2.虚拟机栈,局部变量,操作数等.当方法需要的栈深度超过规定的最大深度,会报stackFlowOver异常 3.堆,对象分配 4.本地方法栈,native方法使用 5.方法区(包括运行常量池),常量,静态变量以及类的相关信息,Class对象(比较特殊)也在这里 6.直接内存,比如nio就会使用直接内存,…
一.类型生命周期的开始 如图所示 初始化时机 所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化: 以下几种情形符合主动使用的要求: 当创建某个类的新实例时(或者通过在字节码中执行new指令,或者通过不明确的创建.反射.克隆和反序列化): 当调用某个类的静态方法时(即在字节码中执行invokestatic指令): 当使用某个类或接口的静态字段,或者对该字段赋值时(用final修饰的静态字段除外,它被初始化为一个编译时常量表达式): 当调用Java API中的某些反射方法: 当初始化某个…
1.堆的大小可以通过 -Xms 和 -Xmx 来设置,一般将他们设置为相同的大小,目的是避免在每次垃圾回收后重新调整堆的大小,比如 -Xms=2g -Xmx=2g 或者 -Xms=512m -Xmx=512m 2.年轻代大小可以通过 -Xmn 来设置,比如-Xmn=2g 或者 -Xmn512m,此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 3.年老代大小 = 堆大小 – 年轻代大小 4.持久代或者永久代大小可以通过 -XX:PermSize 和 -XX:MaxPermSize 来控…
java虚拟机内存管理图如下图所示: 1.线程共享区,是所有的线程所共用的,线程共享区有一下几个组成: 1.方法区: 1.运行时常量池,已经被虚拟机加载的类信息(1.类的版本信息,2.字段,3.方法,4.接口等),常量,静态变量,即时编译器编译后的代码等数据. 2.垃圾回收器也会光顾这个区域,例如常量池. 3.HotSpot中用方法区来实现永久代.这样的做的好处就是,垃圾回收器可以像管理java堆一样管理这部分内存,省去了为方法区编写内存管理的工作,注意的是这 仅仅限于HotSpot中,其他的虚…
jvm内存区域总体分为5大块:方法区,java堆,虚拟机栈,本地方法栈,程序计数器,按照线程来分的话又分为线程共享区和线程独占区 程序计数器: a.程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器 b.此区域是唯一一个在java虚拟机规范中没有任何outofmemoryerror情况的区域 c.如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果正在执行的是native方法(即本地方法栈服务的方法),这个计数器的值为undefined…
当我们第一次学习Java时这些原理上的东西就会被提到,但是很少有真正去学习.今天开始从头过一遍Java,打算从JVM开始. 1. JVM是什么 2. JRE和JDK 3. JVM结构 3.1. 程序计数器(PC, Program Counter) 3.2. Java虚拟机栈(Stack,Java Virtual Mechine Stacks) 3.3. 本地方法栈(Native Stack) 3.4. Java 堆(Heap, Garbage Collection Heap) 3.5. 方法区(…
一:虚拟机内存图解 JAVA程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行JAVA程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理内存数据区域划分如下图: 数据区域分类: 方法区            (Method Area) 虚拟机栈         (VM Stack) 本地方法栈     (Native Method Stack) 堆                   (Heap) 程序计数器    (Program Counter Register) 直接…
本文将介绍JDK自带的JVM排查工具.其提供的排查工具有: (1)jps:JVM Process Status Tool,显示系统内所有的JVM进程: (2)jstat:JVM Statistics Monitoring Tool,可以收集JVM相关的运行数据: (3)jinfo:Configuration Info for Java,显示JVM配置信息: (4)jmap:Memory Map for Java,用于生成JVM的内存快照: (5)jhat:JVM Heap Dump Browse…
JVM基本结构 一.运行时内存区域 java虚拟机所管理的内存将会包括以下几个运行时内存区域. 1.程序计数器 Program Counter Register:可以看作当前线程(线程私有)所执行的字节码行号指示器. 2.Java虚拟机栈 Java Virtual Machine Stacks:也是线程私有的,描述了Java方法执行的内存模型:每个方法在执行时都会创建一个栈帧用于存储---局部变量表.操作数栈.动态链接.方法出口等信息.每一个方法从调用到执行完毕的过程,都对应着一个栈帧在虚拟机栈…
一.垃圾回收器配置和 GC 日志分析 1.堆典型配置: 32位的操作系统限制堆大小介于1.5G到2G,64位操作系统无限制,同时系统可用虚拟内存和可用物理内存都会限制最大堆的配置. 堆空间分配典型配置: 1.-Xms:初始堆大小 2.-Xmx:最大堆大小 3.-XX:NewSize=n:设置年轻代大小 4.-XX:NewRatio=n:设置年轻代和年老代的比值.如 n 为 2,表示年轻代与年老代比值为 1:2,年轻代占整个年轻代年老代和的 1/3 5.-XX:SurvivorRatio=n:年轻…
Inside JVM 内存模型 来源  原文:https://blog.csdn.net/silentbalanceyh/article/details/4661230 参考:IBM开发中心文档,<Inside JVM> 本文章节:1.JMM简介2.堆和栈3.本机内存4.防止内存泄漏 1.JMM简介 i.内存模型概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有…
一:虚拟机内存图解 JAVA 程序运行与虚拟机之上,运行时需要内存空间.虚拟机执行 JAVA 程序的过程中会把它管理的内存划分为不同的数据区域方便管理. 虚拟机管理内存数据区域划分如下图: 数据区域分类: 方法区:            (Method Area) 虚拟机栈 :        (VM Stack) 本地方法栈 :    (Native Method Stack) 堆:                   (Heap) 程序计数器:    (Program Counter Regi…
参考如下 http://www.cnblogs.com/lao-liang/p/5110710.html http://blog.csdn.net/newjerryj/article/details/8650268 1.1 Java程序执行流程 Java程序的执行依赖于编译环境和运行环境.源码代码转变成可执行的机器代码,由下面的流程完成: Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java虚拟机.Java API和Java Class文件…
一.概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢.经过这么长时间的发展,Java GC机制已经日臻完善,几乎可以自动的为我们做绝大多数的事情. 虽然java不需要开发人员显示的分配和回收内存,这对开发人员确实降低了不少编程难度,但也可能带来一些副作用: 1. 有可能不知不觉浪费了很多内存 2. JVM花…
一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责JAVA_HOME/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. 2.其他类加载器:由java实现,可以在方法区找到其Class对象.这里又细分为几个加载器 a).扩展类加载器(Extension ClassLoader):负责用于加载JAVA_HOM…
http://www.cnblogs.com/LBSer/p/4417148.html 1 问题描述 某服务有两台机器,每隔几天会报警load高,一开始看监控发现gc时间抖动很大,以为是发生了fullgc引起卡顿而未加注意,之后登入线上机器查看日志发现是jvm崩溃导致了服务重启从而引发gc时间抖动.以某天为例,该服务分别在上午7点和上午10点发生jvm崩溃,如果同时发生崩溃将导致线上停服,后果不堪设想. 2 问题分析 崩溃日志显示jvm崩溃发生在在标记清除扫根路径时. 搜索此bug,发现是jvm…