Hotspot内存溢出测试
一、堆溢出
在执行代码时通过设置堆的最小值-Mms以及堆的最大值-Mmx来控制堆的大小,-XX参数dump出堆内存快照以便对内存溢出进行分析。通过创建大量对象来使堆溢出,当堆内存溢出时会提示OutOfMemeoryError:Java heap space信息。
import java.util.List;
import java.util.ArrayList; public class HeapOOM {
static class OOMObject{} public static void main(String[] args) {
List<OOMObject> list =new ArrayList<OOMObject>();
while(true){
list.add(new OOMObject());
}
}
}

二、栈溢出
栈溢出的原因主要是方法调用嵌套太深超出了虚拟机所允许的最大深度,这时会出现StackOverflowError异常。
import java.lang.Throwable;
public class JavaVMStackSOF{
private int stackLength=1;
public void stackLeak(){
stackLength ++;
stackLeak();
}
public static void main(String[] args) {
JavaVMStackSOF sof = new JavaVMStackSOF();
try{
sof.stackLeak();
}catch(Throwable e){
System.out.println("stack length: " + sof.stackLength);
throw e;
}
}
}
指定栈的大小最多为128kb,如果在openJDK下,这个值会引起虚拟机报错


在执行java代码时会启动JVM,JVM对于操作系统来说是一个普通的进程。因为使用到了虚拟内存映射技术。JVM在自己看了物理机上只存在自己和OS。我们假定物理内存4G,操作系统使用了1G,则JVM可用空间为3G。这3G中除去方法区和堆区(这两个区域java线程共享),剩下的区域(虚拟机栈、本地方法栈和程序计数器)是每个线程独占的。程序计数器所占区域很小,而在Hotspot中虚拟机栈和本地方法栈是被融合在一起的。剩余区域固定、栈大小固定,则在JVM虚拟中可以创建的线程数量是固定的。所以,当我们在创建线程时如果出现内存溢出、无法创建更多的线程的错误时,就应该注意到线程数应该达到上限了。在这种情况下仍需要创建更多的线程,要的增大物理内存,要么减少栈的大小。
方法区溢出
方法区存放的是与类相关的信息,如类名、访问修饰符、常量池、字段描述、方法描述等。本来可以通过创建大量的字符串常量来增大常量池从而导致方法区溢出。JAVA6可以使用上述方法来达到测试效果,但是由于JAVA7的优化,使得在常量存储有了改进。这里只能动态创建大量的类来使常量区溢出。动态创建类时使用到了CGLib库,该库是用来实现代理的类的。这里使用它来创建大量的类。
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; public class JavaMethodAreaOOM{
public static void main(String[] args) {
while(true){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMObject.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor(){
@Override
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, args);
}
});
enhancer.create();
}
} static class OOMObject{}
}
使用JDK7运行时出现的异常,这里只显示了出现了内存溢出

使用JDK6时出现的异常,这里显示出是永久区出现异常

在运行时通过PermSize以及MaxPermSize来控制方法区的大小,在JDK6中,方法区中的内容也是通过GC来管理的,这块区域被划分为永久代,所以即使被GC管理也不会出现回收的状况。但是在JDK7中将永久代弱化了,所以在JDK7上运行时会并没有出现永久代区域溢出。
总结
通过上面的测试,可以对java中的内存分布有个了解。并且为内存溢出也提供了分析的依据。在使用java虚拟机时,通过调整上面的几个参数,可以让虚拟机有个更好的运行状态。
Hotspot内存溢出测试的更多相关文章
- 【深入Java虚拟机】之一:Java内存模型与内存溢出
[深入Java虚拟机]之:Java内存区域与内存溢出 高速缓存模型如下: ----------------------------------------------------分割线-------- ...
- 【深入Java虚拟机】之三:内存溢出
为了更直接的了解各区域,下面我们来看几个示例. 1.Java 堆溢出 下面的程中我们限制Java 堆的大小为20MB,不可扩展(将堆的最小值-Xms 参 数与最大值-Xmx 参数设置为一样即可避免堆自 ...
- php导出超大csv导出方法,读取超大文件或者接受超大数组,防止内存溢出
基本思路就是,知道总数之后分割成2万一个数组进行查询,最后独立写入csv,避免数据过大导致溢出 速度还不错,在php7下,机器I5 8G内存,128G,SSD,52W多条,大概也就30秒,出来整个文件 ...
- JVM异常之:直接内存溢出
示例: package com.dxz.jvm; import java.lang.reflect.Field; import sun.misc.Unsafe; /** * @Described:直接 ...
- JAVA:测试java虚拟机支持的最大内存 Xmx 值?Tomcat 内存溢出?(转)
如下命令,即可测试:不断调整n的值,windows上32位的1.6x为: 1610m java -Xmx1610M -versionjava -Xmx1610m -version 网摘的tomcat内 ...
- Android 内存溢出管理与测试
今天发现正在做的项目,时不时的会报错:dalvikvm heap out of memory on a 7458832-byte allocation (堆分配的内存溢出) 为什么会内存溢出呢?我以前 ...
- Java内存区域与内存溢出异常--HotSpot虚拟机对象探秘
以常用的HotSpot和常用的Java堆为例,深入探讨HotSpot虚拟机在Java堆中对象分配.布局和访问的全过程 1.对象的创建 ①虚拟机遇到一条new指令后,首先将去检查这个指令的参数是否能够在 ...
- java虚拟机(十)--性能监控工具测试内存溢出和死锁基本思路
在之前就曾经简单介绍过jdk自带的性能检测工具,但是只是很入门的内容.没有真正的用过都是白扯了,面试的时候也说不过去,更别提真正 在生产环境去解决问题,所以这里我们学习一下真正解决问题的过程,最起码面 ...
- 记录:测试本机下使用 GPU 训练时不会导致内存溢出的最大参数数目
本机使用的 GPU 是 GeForce 840M,2G 显存,本机内存 8G. 试验时,使用 vgg 网络,调整 vgg 网络中的参数,使得使用对应的 batch_size 时不会提示内存溢出.使用的 ...
随机推荐
- SlidingMenu的简单使用
1.java代码 1.引入slidingmenu的库 * 2.定义activity继承SlidingFragmentActivity * 3.将onCreate方法改为public的 * 4.加载sl ...
- bootstrap简单的过一遍
注:.xxxx 表示类(class=xxxx) <h1>到<h6>均可使用.另外还提供了.h1到.h6的class .lead可以让段落突出显示 <small> ...
- java 判断两个时间相差的天数
1.实现目标 输入:两个日期 输出:两个日期相差的天数 2.代码实现 方法1: 通过Calendar类的日期比较.注意:这里需要考虑一下: 日期是跨年份的,如一个是2012年,一个是2015年的 ...
- Java设计模式之代理模式
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式: 人如其名,代理相 ...
- C++ 之 重载赋值操作符
Widget 类中,定义了一个 Bitmap 类型的私有数据成员 -- pb 指针 class Bitmap { ... }; class Widget { private: Bitmap *pb; ...
- Episode 388: Testing vs Monitoring
A user-facing bug causes search results to be unavailable for your service. Someone suggests adding ...
- HDU2639Bone Collector II[01背包第k优值]
Bone Collector II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 给ros安装arbotix simulator仿真环境
首先下载程序包.编译.安装. cd ~/catkin_ws/src git clone https://github.com/pirobot/rbx1.git cd rbx1 git checkout ...
- java 22 - 16 多线程之生产者和消费者的问题
生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获 ...
- chrome插件编写之新版hello world
编写chrome插件之前,需要熟悉一下相应的chrome插件开发环境.从编写hello world开始,参考阅读官方的教程,是一个不错的选择.这里主要是基于chrome的官方教程,稍稍做了一些修改和扩 ...