java中之内存溢出说明
java语句是编译型和解释型语言,选通过编译命令javac 把java文件编译为.class字节码文件,然后通过java虚拟机(JVM)加载class文件到内存运行。
而java虚拟机在运行程序时有自己的内存管理机制,大致可以分为方法区,java虚拟机栈,本地方法栈,堆,程序计数器。
大致如下图所示:

下面来单独说说这几个区域是干什么的,以及可能出现的异常实例说明:
方法区:
是class字节码文件加载到内存时,会把一些常量数据,类文件信息,静态变量,java即时编译的代码等数据,是线程共享的数据。运行时常量池是方法区的一部分(和jdk的版本有关系,后续会有说明),
常量池中的内容不一定都是编译的时候产生的,比如String.intern()方法,可以在运行时产生字符串放到常量池中,当常量池无法再申请到内存时,会抛出OutOfMemoryError异常。
可以通过虚拟机参数设置方法区的大小: -XX:PermSize 和 -XX:MaxPermSize来限定方法区的大小。
程序举例如下所示:
package com.three.fourteen; import java.util.ArrayList;
import java.util.List; public class TestMethod { /**
* 设置方法区的参数为:
* -XX:PermSize=10M -XX:MaxPermSize=10M
* @param args
*/
public static void main(String[] args) { List<String> lists=new ArrayList<String>();
int i=1;
while(true) {
lists.add(String.valueOf(i++).intern());
}
}
}
上面的代码会产生内存溢出:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.util.Arrays.copyOf(Unknown Source)
at java.util.ArrayList.grow(Unknown Source)
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at com.three.fourteen.TestMethod.main(TestMethod.java:18)
这个和jdk版本有关系,本地是使用jdk 1.8测试,测试结果显示java堆内存溢出,而不是方法区溢出,可以确定jdk1.8版本中的常量池存放到java堆中。
java虚拟机栈:
此部分是线程私有的区域,为了解决多线程的同步问题,每个线程需要的变量都会主存中复制一份备份放到虚拟机栈中ThreadLocal,此部分是每个线程都会创建并且私有的,
各线程操作的都是线程备份的副本,彼此间互不干涉。存放的是一些变量名和一些对象的引用。若是栈中无法申请在申请到内存,则会抛出StackOutOfMemoryError异常。
设置栈的大小的参数是: -Xss=128k
具体代码如下所示:
public class TestThreadLocal {
private int i=0;
public void StackOverFlow() {
i++;
StackOverFlow();
}
public static void main(String[] args) {
TestThreadLocal ttl=new TestThreadLocal();
ttl.StackOverFlow();
}
}
Exception in thread "main" java.lang.StackOverflowError
at com.three.fourteen.TestThreadLocal.StackOverFlow(TestThreadLocal.java:9)
at com.three.fourteen.TestThreadLocal.StackOverFlow(TestThreadLocal.java:9)
at com.three.fourteen.TestThreadLocal.StackOverFlow(TestThreadLocal.java:9)
...............
提示栈溢出
以上都是出自深入理解Java虚拟机中的部分内容!
java中之内存溢出说明的更多相关文章
- java中的内存溢出和内存泄漏
内存溢出:对于整个应用程序来说,JVM内存空间,已经没有多余的空间分配给新的对象.所以就发生内存溢出. 内存泄露:在应用的整个生命周期内,某个对象一直存在,且对象占用的内存空间越来越大,最终导致JVM ...
- Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
转载自:http://blog.sina.com.cn/s/blog_701c951f0100n1sp.html 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题, ...
- java中出现内存溢出的几种情况
情况一:java.lang.OutOfMemoryError: Java heap space 原因:java堆内存不足,可能是真的不足,也可能是程序中有死循环 方案:1.调整JVM参数-Xms204 ...
- Java中常见内存溢出模拟及错误分析
在JVM虚拟机规范中,Java虚拟机运行时数据区域除了程序计数器(Program Counter Register)外都有可能出现OutOfMemoryError的情况,使用Hotspot虚拟机简单的 ...
- Java中OutOfMemoryError(内存溢出)的情况及解决办法
java.lang.OutOfMemoryError: Java heap space // TODO Auto-generated method stub Vector v = new Vector ...
- Java架构师中的内存溢出和内存泄露是什么?实际操作案例!
JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1.内存泄漏(memory leak ) 申请了内存用完了不释放,比如一共有 102 ...
- java虚拟机涉及内存溢出
Java语言写的代码是.java文件,它会被特定程序编译(javac.exe,它会被Eclipse之类的IDE调用)成字节码(bytecode),字节码不能直接在CPU上运行,需要另一个程序读取并执行 ...
- 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码
程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...
- 深入理解java虚拟机【内存溢出实例】
通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...
随机推荐
- Tomcat笔记 #01# WEB应用管理工具简介
索引 查看JVM以及SERVLET/接口的情况 动态管理WEB应用 Tomcat自带了一个基于网页的web应用管理工具,可以帮助我们监控&管理部署上去的WEB APP,特别方便!恰好之前碰到的 ...
- Oracle使用——oracle11g安装——Oracle要求的结果: 5.0,5.1,5.2,6.0 6.1 之一 实际结果: 6.2
问题 正在检查操作系统要求... 要求的结果: 5.0,5.1,5.2,6.0 之一 实际结果: 6.1 检查完成.此次检查的总体结果为: 失败 <&l ...
- EmberJS 为什么我偏爱 Ember.js 胜过 Angular 和 React.js
文章写的很老到,非常值得一看!评论也很精彩,值得一看 为什么我偏爱 Ember.js 胜过 Angular 和 React.js 前几天看到了这篇文章:Why I prefer Ember.js ov ...
- JS(JavaScript)的初了解6(更新中···)
Js数据类型具体分析 基础类型: string number boolean null undefined 引用类型: object ==> json array 等 复习 ...
- 关于php下的ajax赋值传值的调试
在tp中, 在js中也可以使用 模板变量替换(比如__PUBLIC__)和 模板函数调用(比如: {:U('..')}) 等. 但是 只有直接放在 相应的 模板文件中, 只有放在index.html之 ...
- 解决win10 蓝牙设备只能配对无法连接 ,并且删除设备无效的问题
系统环境: win10家庭版 dell本 问题描述:蓝牙设备(比如蓝牙键盘,蓝牙音箱)出现无法连接的情况,打算删除已配对的设备,再重新配对连接.但删除设备后重启蓝牙,那些原本被删除的设备又自动配对上, ...
- fprintf中使用stderr
fprintf是C/C++中的一个格式化写-库函数,位于头文件<stdio.h>中,其作用是格式化输出到一个流/文件中 运行如下代码: #include <stdio.h> v ...
- vue 学习笔记(一)
对于 vue 官网给的教程由浅及深,非常容易上手.我之前有过 react 项目开发经验,对 webpack 打包,脚手架这一类的东西并不陌生.所以也是我上手比较快的原因吧.简单将我在学习 vue 中遇 ...
- .NET常用功能
1.判断对象判不为null或不为""或不为"undefined" public static bool isNotNullOrBlank(Object obj) ...
- 小程序分享进入H5动态网页
在要分享的界面加上这段代码 onShareAppMessage: function (options) { var that = this; // var return_url = that.data ...