码迷,mamicode.com
首页 > 编程语言 > 详细

java.lang.OutOfMemoryError: Java heap space

时间:2017-11-02 11:22:32      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:操作   调用   .com   通过   程序   存储空间   指针   存储   常量池   

在Myeclipse中测试restful接口返回数据的时候,直接采用main方法执行程序,但是几秒钟后程序报错,返回字符串结果正常,只是数据量有点大。

技术分享


   先查看源代码Arrays.java:2367

技术分享

创建char数组对象时候报错,错误信息堆空间溢出


 华丽的分割线,下面堆和栈的解释还是比较清楚的


 ◆寄存器:我们在程序中无法控制

◆栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中(new 出来的对象)

◆堆:存放用new产生的数据

◆静态域:存放在对象中用static定义的静态成员

◆常量池:存放常量

◆非RAM存储:硬盘等永久存储空间

 

从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的。

所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。

 

  • JVM中的堆和栈 

  JVM是基于堆栈的虚拟机,JVM为每个新创建的线程都分配一个堆栈,也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态,JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。 

  当线程激活一个Java方法JVM就会在线程的Java堆栈里新压入一个帧,这个帧自然成为了当前帧。在此方法执行期间,这个帧将用来保存参数、局部变量、中间计算过程和其他数据。

  每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)。 

 

  • Java 中的堆和栈 

  Java把内存划分成两种:一种是栈内存,一种是堆内存。 

  在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 

  堆内存用来存放由new创建的对象和数组。 

栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。

缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。


下面是解决方法

  • 方法1、单个类运行:

选择Run Configuration或者Debug Configurations在VM arguments中设置参数 -Xms128m -Xmx512m

参数的含义
-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
-vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了
-Xms128m JVM初始分配的堆内存
-Xmx512m JVM最大允许分配的堆内存,按需分配
-XX:PermSize=64M JVM初始分配的非堆内存
-XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配

技术分享

  • 方法2、整体运行环境设置

Preferences-->Java-->Installed JREs编辑正在使用中的jdk,

技术分享

 在Default VM Arguments中设置参数 -Xms128m -Xmx512m

 技术分享

java.lang.OutOfMemoryError: Java heap space

标签:操作   调用   .com   通过   程序   存储空间   指针   存储   常量池   

原文地址:http://www.cnblogs.com/aaron911/p/7770618.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!