文档章节

深入理解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
徐汇
程序员
面试中关于Java虚拟机(jvm)的问题看这篇就够了

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

snailclimb
05/12
0
0
《深入理解Java虚拟机》学习小记一之自动内存管理机制(一)

Java内存区域与内存溢出异常 一、概要 我们可以带着以下几个问题去学习自动内存管理机制,罗列如下: 什么操作可能导致内存溢出? 有哪些种类的内存溢出? 都是在内存的哪些区域溢出? 垃圾收...

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

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

曦阳x
07/23
0
0
【JVM】 java内存区域与内存溢出异常

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

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

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

07/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

设计模式之 明确责任 观察者模式 状态模式 责任链模式

观察者模式是任务分发的一种模式。 如果认为我们设计的系统的各个模块(或子系统)的最终目的是完成共同任务,那么这个任务如何分配到多个模块的就是我们遇到的第一个问题。简单设计场合我们...

backbye
16分钟前
2
0
14-利用思维导图梳理JavaSE-大汇总

14-利用思维导图梳理JavaSE-Java基础知识大汇总 主要内容 1.对象入门 2.一切都是对象 3.程序流程控制 4.初始化和消除 5.权限访问控制 6.复用类 7.多态 8.接口与抽象类 9.内部类 10.容器 11.异...

飞鱼说编程
51分钟前
5
0
利用Lombok编写优雅的spring依赖注入代码,去掉繁人的@Autowired

大家平时使用spring依赖注入,都是怎么写的? @Servicepublic class OrderService { @Autowired private UserService userService;} 是不是很熟悉的感觉?但是呢 如果你用...

HeyS1
58分钟前
25
0
IBATIS 写BLOB字段遇到的问题

1、 首先遇到的配置问题,通过设置typeHandler 来支持写入。接下来由此引出了事务的问题。 <typeHandler jdbcType="BLOB" javaType="[B" callback="org.springframework.orm.ibatis.support....

echo-neo
今天
1
0
37. Sudoku Solver

Description tags: backtrack,hash table difficulty: hard Write a program to solve a Sudoku puzzle by filling the empty cells.A sudoku solution must satisfy all of the following......

52iSilence7
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部