文档章节

深入理解Java虚拟机之内存区域与内存溢出

YH_猿员猿
 YH_猿员猿
发布于 2016/07/21 17:32
字数 804
阅读 5
收藏 0
当我们在c和c++编程的时候,我们对数据对象的操作与内存是紧密联系的,而在java编程中,我们并没有密切的关注内存是如何分配的,这些都交由java虚拟器进行管理,有时,我们运行一个程序的时候就可能发生内存泄露和溢出的问题。

关于java虚拟机的博客均参自与《深入理解Java虚拟机》这本书来做得一些笔记和体会。

java将内存划分为以下几个部分:
这里写图片描述

其中方法区和堆是有所有线程共享的
虚拟机栈,本地方法栈,程序计数器是线程隔离的

程序计数器

  1. 占用内存非常小,用于最基本的字节码的指令操作
  2. 每个线程的程序计数器相互独立
  3. 唯一一个在java虚拟机中没有规定任何OutMemoryError情况的区域。

Java虚拟机栈

  1. 线程私有,与线程同生共死。
  2. 作用为在Java方法的执行时创建栈帧,用于存储局部变量,操作数栈,动态链接,对应的栈的出栈和入栈,存储的为临时的信息。
  3. 两种异常:如果线程请求的栈的深度大于虚拟机所允许的,抛出StackOverflowError异常;如果虚拟机栈扩展超过Java虚拟机所允许的固定长度,则抛出OutMemoryError异常。

本地方法栈

  1. 与虚拟机栈相似,区别在于java虚拟机栈执行的是java方法服务,而本地方法栈是为虚拟机使用到的Native(本地方法支持)方法服务。
  2. 异常也有两个与虚拟器栈相同

Java堆

  1. Java堆是虚拟机中内存最大的一块,所有线程共享一块堆空间。
  2. 唯一目的:存放对象实例,自定义对象,数组….
  3. 是Java垃圾管理器管理(GC)的主要区域。
  4. 异常:当堆内存分配完毕,并无法扩展时,会抛出OutMemoryError异常。

方法区

  1. 各线程共享
  2. 主要用于存储已被虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等数据。
  3. 垃圾回收较难,
  4. 与堆一样有OOM异常

运行时常量池

  1. 为方法区的一部分,就是存储常量的。
  2. 具有动态性。
  3. 异常与方法区一致。

直接内存

  1. 存放缓冲的,随着NIO(new Input/Output)的引入,引入的一种缓存机制
  2. 不属于java虚拟机
  3. 有内存超出异常

以上为个方法区域的总结。

Java对象的访问:

Object o = new Object();
创建对象会涉及到三个方法区。定义的obj变量会反射到Java本地变量表中,new Object()会在堆空间中分配一块存储Object对象所有属性和方法的结构化内存。对象的类型,父类,实现的接口等信息存储在方法区中。

访问方式:
1.句柄访问方式在堆中划分出句柄池,存储对象句柄地址。
2.直接指针访问

本文转载自:http://blog.csdn.net/yin569258/article/details/51000670

共有 人打赏支持
YH_猿员猿
粉丝 0
博文 12
码字总数 0
作品 0
徐汇
程序员
私信 提问
JVM 深入笔记(2)内存溢出场景模拟

JVM 深入笔记(2)各内存区溢出场景模拟 作者:柳大 · Poechant 电邮:zhongchao.ustc#gmail.com (#->@) 博客:blog.csdn.net/poechant 日期:Feb. 23st 2012 《JVM 深入笔记(1)内存区域是...

晨曦之光
2012/04/24
126
0
深入理解 Java 虚拟机学习(一) -- java 内存区域与内存溢出异常

java 内存区域 要进行 java 虚拟机的深入学习,首先要了解的是 java 的内存划分。大部分程序员一开始接触 java ,对于内存的划分是印象是堆内存和栈内存,而这仅仅适合于入门的学习,实际上 ...

偷星辰夜
2017/09/28
0
0
【JVM】 java内存区域与内存溢出异常

前言 此系列博客是读《深入理解java虚拟机》所做的笔记整理。 No1. JVM内存管理这堵墙? 对C和C++的开发人员来说,在内存管理领域,他们既拥有每一个对象的“所有权”,也担负着每一个对象生...

binggetong
05/07
0
0
深入理解java虚拟机学习笔记(一)JVM内存模型

上周末搬家后,家里的宽带一直没弄好,跟电信客服反映了N遍了终于约了个师傅明天早上来迁移宽带,可以结束一个多星期没网的痛苦日子了。这段时间也是各种忙,都一个星期没更新博客了,再不写...

07/20
0
0
面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb
05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CockroachDB

百度云上的CockroachDB 云数据库 帮助文档 > 产品文档 > CockroachDB 云数据库 > 产品描述 开源NewSQL – CockroachDB在百度内部的应用与实践 嘉宾演讲视频及PPT回顾:http://suo.im/5bnORh ...

miaojiangmin
24分钟前
0
0
I2C EEPROM驱动实例分析

上篇分析了Linux Kernel中的I2C驱动框架,本篇举一个具体的I2C设备驱动(eeprom)来对I2C设备驱动有个实际的认识。 s3c24xx系列集成了一个基于I2C的eeprom设备at24cxx系列。at24cxx系列芯片包...

yepanl
26分钟前
1
0
spring mvc拦截器,实现统计http请求的后台运行时间

使用两种方式,实现拦截http请求的后台运行时间。 废话不多说直接上代码 /** * Http请求时间统计 * 拦截所有请求 */public class HttpRquestTimeInterceptor extends HandlerIntercepto...

兜兜毛毛
43分钟前
2
0
设计模式之工厂模式

本篇博文主要翻译这篇文章: https://www.journaldev.com/1392/factory-design-pattern-in-java 由于翻译水平有限,自认为许多地方翻译不恰当,欢迎各位给出宝贵的建议,建议大家去阅读原文。...

firepation
59分钟前
4
0

中国龙-扬科
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部