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中之内存溢出说明的更多相关文章

  1. java中的内存溢出和内存泄漏

    内存溢出:对于整个应用程序来说,JVM内存空间,已经没有多余的空间分配给新的对象.所以就发生内存溢出. 内存泄露:在应用的整个生命周期内,某个对象一直存在,且对象占用的内存空间越来越大,最终导致JVM ...

  2. Java中OutOfMemoryError(内存溢出)的三种情况及解决办法

    转载自:http://blog.sina.com.cn/s/blog_701c951f0100n1sp.html 相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题, ...

  3. java中出现内存溢出的几种情况

    情况一:java.lang.OutOfMemoryError: Java heap space 原因:java堆内存不足,可能是真的不足,也可能是程序中有死循环 方案:1.调整JVM参数-Xms204 ...

  4. Java中常见内存溢出模拟及错误分析

    在JVM虚拟机规范中,Java虚拟机运行时数据区域除了程序计数器(Program Counter Register)外都有可能出现OutOfMemoryError的情况,使用Hotspot虚拟机简单的 ...

  5. Java中OutOfMemoryError(内存溢出)的情况及解决办法

    java.lang.OutOfMemoryError: Java heap space // TODO Auto-generated method stub Vector v = new Vector ...

  6. Java架构师中的内存溢出和内存泄露是什么?实际操作案例!

    JAVA中的内存溢出和内存泄露分别是什么,有什么联系和区别,让我们来看一看. 01 内存泄漏 & 内存溢出 1.内存泄漏(memory leak ) 申请了内存用完了不释放,比如一共有 102 ...

  7. java虚拟机涉及内存溢出

    Java语言写的代码是.java文件,它会被特定程序编译(javac.exe,它会被Eclipse之类的IDE调用)成字节码(bytecode),字节码不能直接在CPU上运行,需要另一个程序读取并执行 ...

  8. 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  9. 深入理解java虚拟机【内存溢出实例】

    通过简单的小例子程序,演示java虚拟机各部分内存溢出情况: (1).java堆溢出: Java堆用于存储实例对象,只要不断创建对象,并且保证GC Roots到对象之间有引用的可达,避免垃圾收集器回收 ...

随机推荐

  1. callable函数 stride的意义 Math.round(),Math.ceil(),Math.floor()用法

    callable()函数检查一个函数是否可以调用 如果返回True,object仍然可能调用失败:但如果返回False,调用对象ojbect绝对不会成功. 对于函数, 方法, lambda 函式, 类 ...

  2. kubernets controller 和 CRD 具体组件分析

    (dlv) b k8s.io/sample-controller/pkg/client/informers/externalversions.(*sharedInformerFactory).Info ...

  3. [C++ Primer Plus] 第10章、对象和类(一)程序清单——辨析三个const

    程序清单10.1+10.2+10.3 头文件stock.h #ifndef STOCK00_H_ //先测试x是否被宏定义过 #define STOCK00_H_ //如果没有宏定义,就宏定义x并编译 ...

  4. 基于OpenCV做“三维重建”(4)--相机姿态还原和实现三维重建

    v当我们构建成功了viz,就可以使用3维效果给我们提供的便利,进一步进行一些3维的操作. 在这个动画中,注意图片后面的那个黑线,对应的是相机的位置. /*----------------------- ...

  5. Django路由控制

    本文目录 一 Django中路由的作用 二 简单的路由配置 三 有名分组 四 路由分发 五 反向解析 六 名称空间 七 django2.0版的path 回到目录 一 Django中路由的作用 URL配 ...

  6. time模块和os模块,json模块

    import time # def month(n): # time.local() # struct_time=time.strptime("%Y-%m-1","%Y- ...

  7. buaacoding_2018算法期末上机G题.地铁建设题解

    // 标注:本文旨在为博主确立一种题解的基本范式,以避免博主的题解流于AC代码的粘贴.此基本范式为:完整而简洁明了的思路及其推导说明,力图触及问题的本质并衍生对同类问题的思路分析,使得题解具有泛用性, ...

  8. ProtoType原型和__Proto__原型链的详解

    var arr = new Array(12,13,14,15,16,17,18); var arr2 = new Array(12,13); arr.sun=function(){ //用原型加Ar ...

  9. python on sql

    USE [DemoDb]GOexecute sp_execute_external_script @language = N'Python', @script = N'a = 1b = 2c = a/ ...

  10. Shiro 与spring 整合的及简单使用(转)

    文章完全转载自: http://www.cnblogs.com/learnhow/p/5694876.html  ,大家可以点击访问原文链接,个人仅作学习收藏 ! 本篇内容大多总结自张开涛的<跟 ...