JVM学习总结(一):Java内存区域
一、JVM运行时数据区
1、程序计数器:
(1)一块较小的线程私有的内存空间。
(2)JVM的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(或一个内核)只会执行一条线程中的指令。
(3)为了线程切换后能恢复到原先的执行位置,每条线程都需要一个独立的程序计数器,互不影响,独立存储。
(4)如果线程执行的是一个Java方法,程序计数器记录的就是正在执行的虚拟机字节码指令的地址;如果线程执行的是Native方法,程序计数器的值则为空。
(5)程序计数器是JVM规范中唯一一个没有规定任何OutOfMemoryError(内存溢出)异常的区域。
2、虚拟机栈
(1)线程私有的,生命周期与线程相同。
(2)虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
(3)笼统的划分会把Java的内存区分为堆内存(Heap)和栈内存(Stack),这里的栈指的就是虚拟机栈,或者说是虚拟机栈的局部变量表部分。
(4)局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型(指向了一条字节码指令的地址)。
(5)局部变量表在编译期间即确定了所需的内存空间,并且大小固定不会改变。
(6)栈有可能会抛出两种异常:StackOverflowError和OutOfMemoryError。
3、本地方法栈
与虚拟机栈作用类似,区别就是虚拟机栈为执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。
4、堆
(1)所有线程共享的一块内存区域,在虚拟机启动时创建。
(2)唯一目的就是存放对象实例。
(3)Java堆是垃圾收集器管理的主要区域,有时也被称为GC堆。
5、方法区
(1)线程共享的内存区域,用于存储已加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
(2)虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它有一个别名叫做Non-Heap(非堆)。
(3)这部分区域的内存回收主要是针对常量池的回收和对类型(Class)的卸载。
6、运行时常量池
(1)方法区的一部分。
(2)包括各种字面量和符号引用。
二、直接内存
1、Direct Memory,不属于虚拟机运行数据区的一部分。
2、JDK1.4中新加入了NIO类,基于通道和缓冲区的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过存储在Java堆中的DirectByteBuffer对象来操作直接内存的引用。
3、直接内存的分配不受Java堆大小的限制,但是如果配置虚拟机参数时忽略直接内存,可能会导致动态扩展时出现OutOfMemoryErrory异常。
JVM学习总结(一):Java内存区域的更多相关文章
- JVM系列1:Java内存区域
JVM系列主要分享自己都虚拟机的理解,我自学时的知识框架多来源于<深入理解Java虚拟机_JVM高级特性与最佳实践>这本书,感兴趣的朋友可直接去阅读这本书. 本系列暂定有3部分,它们是学习 ...
- JVM系列一(Java内存区域和对象创建).
一.JVM 内存区域 堆 - Heap 线程共享,JVM中最大的一块内存,此内存的唯一目的就是存放对象实例,Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称为"GC堆"( ...
- JVM虚拟机(三):Java内存区域
运行时数据区 Java虚拟机再执行Java程序过程中会把它所管理的内存划分为若干个不同分工的数据区域. 程序计数器 程序计数器时一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示 ...
- 深入理解JVM(一)Java内存区域
运行时数据区 程序计数器 当前线程执行的字节码的行号指示器 每条线程都有独立的程序计数器,各线程之间计数器互不影响,独立存储. 如果执行的是java方法,计数器记录正在执行的虚拟机字节码指令的位置: ...
- java虚拟机学习-JVM内存管理:深入Java内存区域与OOM(3)
概述 Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来. 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又 ...
- 学习jvm(一)--java内存区域
前言 通过学习深入理解java虚拟机的教程,以及自己在网上的查询的资料,做一个对jvm学习过程中的小总结. 本文章内容首先讲解java的内存分布区域,之后讲内存的分配原则以及内存的监控工具.再下来会着 ...
- JVM学习笔记(一):Java内存区域
由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分.在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 首先Java源代码文件(. ...
- JVM高级特性与实践(一):Java内存区域 与 内存溢出异常
套用<围城>中的一句话,“墙外面的人想进去,墙里面的人想出来”,用此来形容Java与C++之间这堵内存动态分配和垃圾收集技术所围成的“围墙”就再合适不过了. 对于从事C.C++的开发人员而 ...
- 【搞定Jvm面试】 Java 内存区域揭秘附常见面试题解析
本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错 ...
- JVM Java 内存区域透彻分析(转)
出处: Java 内存区域透彻分析 Java8内存模型—永久代(PermGen)和元空间(Metaspace) 这篇文章主要介绍Java内存区域,也是作为Java虚拟机的一些最基本的知识,理解了这 ...
随机推荐
- python几种常见的模块安装方法
1. 在线安装 1.1 在命令提示符中运行 pip install package_name 指令 注:具体前置步骤和教程:http://www.cnblogs.com/jfl-xx/p/72895 ...
- REACT Missing “key” prop for element
https://stackoverflow.com/questions/48266018/missing-key-prop-for-element-reactjs-and-typescript Whe ...
- protobuf example make backup
# See README.txt. .PHONY: all cpp java python clean all: cpp #java python cpp: add_person_cpp list_p ...
- API的控制器
// GET: api/showApi /// <summary> /// 显示 查询 /// </summary> /// <param name="name ...
- ceph存储集群性能测试工具步骤(初稿)
一.源码安装fio工具: #yum install libaio-devel make #wget http://brick.kernel.dk/snaps/fio-2.2.10.tar.gz #ta ...
- CSS旋转缩放
<style type="text/css"> figure{ float: left;}.test1{ border-radius: 0px; height: 200 ...
- Spark访问Hive表
知识点1:Spark访问HIVE上面的数据 配置注意点:. 1.拷贝mysql-connector-java-5.1.38-bin.jar等相关的jar包到你${spark_home}/lib中(sp ...
- 测试那些事儿—SQL Server服务器角色和数据库用户角色
登录名:登录服务器的用户账号: 服务器角色:登录名对该服务器具有的权限,角色分多种的,一个角色可以有多个登录名,如操作系统的系统用户可以有多个. SQL服务器角色 sysadmin ...
- sql server中case when的用法
Case具有两种格式.简单Case函数和Case搜索函数. --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END ...
- C语言求行列式的值
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <window ...