文档章节

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

YH_猿员猿
 YH_猿员猿
发布于 2016/07/21 17:32
字数 804
阅读 5
收藏 0
点赞 0
评论 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
【JVM】 java内存区域与内存溢出异常

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

binggetong
05/07
0
0
《深入理解Java虚拟机》之内存溢出(2)

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

lixiyuan
2014/04/10
0
0
深入java虚拟机阅读笔记(jvm内存原理、异常处理部分)

深入理解Java虚拟机:JVM高级特性与最佳实践 阅读笔记(内存原理、异常处理): 1. Jvm运行时,内存划分如图所示: 2. 程序计数器: Jvm将这个计数看作当前线程执行某条字节码的行数,会根据...

loda0128
2015/06/04
0
0
深入理解Java虚拟机:JVM高级特性与最佳实践(一):java 内存区域与内存异常

如需转载,请标明转自何处 运行时数据区域: java 虚拟机在执行java程序的过程中会把他管理的内存化为若干个不同的数据区域。这些区域都有各自的用途,销毁与创建的时间,有的区域随着进程的...

熊大熊二
2015/11/03
0
0
一个“Hello World”理解JVM运行时数据区

先上一张JVM体系结构图: 1)运行时数据区:经过编译生成的字节码文件(class文件),由class loader(类加载子系统)加载后交给执行引擎执行。在执行引擎执行的过程中产生的数据会存储在一块内...

ntchan
07/12
0
0
《深入理解Java虚拟机》之Java虚拟机内存结构(1)

这个是很重要的一个基础认识。 java虚拟机规范规定的java虚拟机内存其实就是java虚拟机运行时数据区,其架构如下: 其中方法区和堆是由所有线程共享的数据区。 Java虚拟机栈,本地方法栈和程...

lixiyuan
2014/04/10
0
1
java JVM的内存区域(运行时数据区域)

JVM的内存形式: (1)方法区:存放了要加载的类的信息(名称,修饰符等)、类中的静态变量、类中定义为final的变量、类中Field信息、类中的方法信息,当开发人员通过Class对象的getName、i...

LCZ777
2014/11/25
0
0
OutOfMemoryError详解

絮絮叨叨 最近在看周志明的《深入理解Java虚拟机》,虽然刚刚开始看,但是觉得还是一本不错的书。对于和我一样对于JVM了解不深,有志进一步了解的人算是一本不错的书。注明:不是书托,同样是...

六只
2012/07/04
0
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

spring boot中swagger2使用

1.pom.xml中添加 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version>......

说回答
10分钟前
0
0
tomcat虚拟路径的几种配置方法

tomcat虚拟路径的几种配置方法 一般我们都是直接引用webapps下面的web项目,如果我们要部署一个在其它地方的WEB项目,这就要在TOMCAT中设置虚拟路径了,Tomcat的加载web顺序是先加载 $Tomcat_ho...

Helios51
23分钟前
1
0
Mac 安装jupyter notebook的过程

MAC台式机 python:mac下自带Python 2.7.10 1.先升级了pip安装工具:sudo python -m pip install --upgrade --force pip 2.安装setuptools 工具:sudo pip install setuptools==33.1.1 3.安装......

火力全開
28分钟前
0
0
导航守卫解释与例子

“导航”表示路由正在发生改变。 正如其名,vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中:全局的, 单个路由独享的, 或者组件级的。 记住...

tianyawhl
28分钟前
0
0
Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)

说明:这种方式应该算是最通用的,原理是通过判断标签实现。 <!-- if-then form --> <if condition="some conditional expression"> <then> ... </then> </if> ......

浮躁的码农
42分钟前
1
0
FTP传输时的两种登录方式和区别

登录方式 匿名登录 用户名为: anonymous。 密码为:任何合法 email 地址。 授权登录 用户名为:用户在远程系统中的用户帐号。 密码为:用户在远程系统中的用户密码。 区别 匿名登录 只能访问...

寰宇01
44分钟前
0
0
plsql developer 配置监听(不安装oracle客户端)

plsql developer 配置监听(不安装oracle客户端)

微小宝
51分钟前
2
0
数据库(分库分表)中间件对比

本人的宗旨就是,能copy的,绝对不手写。 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm。 根据一定的规则把数据文件(MYD)和索...

奔跑吧代码
54分钟前
2
0
Netty与Reactor模式详解

在学习Reactor模式之前,我们需要对“I/O的四种模型”以及“什么是I/O多路复用”进行简单的介绍,因为Reactor是一个使用了同步非阻塞的I/O多路复用机制的模式。 I/O的四种模型 I/0 操作 主要...

hutaishi
今天
1
0
【2018.07.16学习笔记】【linux高级知识 20.16-20.19】

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

lgsxp
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部