文档章节

Java深入 - Java内存区域详解

闪电
 闪电
发布于 2016/07/04 11:20
字数 813
阅读 22
收藏 2

Java和c c++不一样,c c++都是直接通过手动的方式来申请内存,释放内容。而java拥有良好的内存自动管理机制。所以在我们开发java程序代码的时候,一般情况下不需要关心java的内存问题。

Java的内存区域图:

上面的图就是Java运行时的内存数据区域。分成方法区,虚拟机栈,本地方法栈,堆,程序计数器。

 

程序计数器

作用:程序计数器是一块很小的内存空间,主要是线程所执行的字节码的行号指示器。每个线程都会有独立的程序计数器。

 

虚拟机栈

Java的虚拟机栈也是线程私有的,生命周期和线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法被调用直至执行完成的过程,就是对应着一个栈帧在VM Stack中从入栈到出栈的过程。

本地方法栈主要为虚拟机使用的Native方法服务,也是栈的一部分。

虚拟机栈会抛两种异常:

1. StackOverflowError异常。通常主要是线程请求的栈深度大于虚拟机所允许的深度。比如递归层次太深就有可能导致这个异常出现,一般1000-2000层之间。减少递归层次可以减小这个防范。也可以通过参数-Xss128k 可以设置每个线程的栈大小。

2. OutOfMemoryError异常。主要是内存不够。

 

Java堆

Java内存中最大的块就是堆。所有的对象实例和数组都会分配在java的堆上面。Java堆也是内存GC的重要区域。

Java堆异常:

1. OutOfMemoryError异常。Java堆内存溢出可以通过设置参数-Xmx3550m -Xms3550m来控制堆内存的大小。-Xms是最小值,-Xmx是最大值。

一般堆溢出:java.lang.OutOfMemoryError: Java heap space

异常提示中都有Java heap space 说明是堆溢出。

一般解决堆溢出思路有三种:

1. 通过内存影像分析工具(Eclipse Memory Analyzer)来定位堆溢出问题

2. 分析是否有内存泄露

3. 调整堆参数。

 

方法区

方法区也是各线程共享的内存区域,主要存放虚拟机加载的类信息、常量、静态变量等信息。

运行时常量池也是方法区的一部分,作用是存储编译期生成的各种字面量和符号引用。

1. OutOfMemoryError异常。发生异常时,主要抛下面类似的异常信息:

 

Exception in thread "main" java.lang.OutOfMemoryError: PermGen space  
    at java.lang.String.intern(Native Method)  
    at org.fenixsoft.oom.RuntimeConstantPoolOOM.main(RuntimeConstantPoolOOM.java:18)


可以看到有 PermGen space的提示则表示方法区溢出。

 

方法区溢出,可以通过限制方法区的内存大小来限制:-XX:PermSize 和 -XX:MaxPermSize

Java1.7的PermGen默认空间为85 MB(或者可以通过-XX:MaxPermSize=XXXm指定)

需要注意的是,PermGen space是Oracle-Sun Hotspot才有,JRockit以及J9是没有这个区域。

 

本文转载自:http://blog.csdn.net/initphp/article/details/29351553

闪电
粉丝 75
博文 392
码字总数 6789
作品 0
海淀
技术主管
私信 提问
JVM 虚拟机(对象创建,类加载器,执行引擎等),

1.揭开 Java 对象创建的奥秘? 2.class 文件结构详解? 3.详解 Java 类的加载过程? > Java 对象创建,class 文件结构 Java对象模型 。Java对象保存在堆内存中。在内存中,一个Java对象包含三...

desaco
2018/08/29
0
0
JVM系列篇:深入详解JVM内存模型与JVM参数详细配置

本系列会持续更新。 JVM基本是BAT面试必考的内容,今天我们先从JVM内存模型开启详解整个JVM系列,希望看完整个系列后,可以轻松通过BAT关于JVM的考核。 BAT必考JVM系列专题 1.JVM内存模型 2....

mikechen优知
03/26
86
0
JVM(二)Java虚拟机组成详解

导读:详细而深入的总结,是对知识“豁然开朗”之后的“刻骨铭心”,想忘记都难。 Java虚拟机(Java Virtual Machine)下文简称jvm,上一篇我们对jvm有了大体的认识,进入本文之后我们将具体...

王磊的博客
01/14
165
0
Java程序员从笨鸟到菜鸟全部博客目录【2012年十一月七日更新】

本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主路线,想想这一年半,...

长平狐
2012/11/12
222
0
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
2018/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Handler简解

Handler 这里简化一下代码 以便理解 Handler不一定要在主线程建 但如Handler handler = new Handler(); 会使用当前的Looper的, 由于要更新UI 所以最好在主线程 new Handler() { mLooper = Lo...

shzwork
8分钟前
1
0
h5获取摄像头拍照功能

完整代码展示: <!DOCTYPE html> <head> <title>HTML5 GetUserMedia Demo</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum......

诗书易经
11分钟前
0
0
正向代理和反向代理

文章来源 运维公会:正向代理和反向代理 1、正向代理 (1)服务对象不同 正向代理服务器的服务对象是客户端,可以将客户端和代理服务器看作一个整体。 (2)配置方法不同 需要在客户端配置代...

运维团
27分钟前
2
0
5个避免意外论文重复率高的方法

即使你不是故意抄袭,但你可能在无意中抄袭了别人的论文, 这个叫做意外抄袭,它可能正发生在你身上,如果你不熟悉学术 道德规范,这里将告诉你5个基本的方法来避免意外抄袭。 Tip1 熟悉其他...

论文辅导员
29分钟前
2
0
Maven通过profiles标签读取不同的配置

<profiles> <profile> <id>dev</id> <properties> <profiles.active>dev</profiles.active> </properties> ......

时刻在奔跑
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部