JVM 运行时数据区 (三)
JVM运行时数据区
运行时数据区由 程序计数器、java虚拟机栈、本地方法栈、堆、方法区 组成;
1、程序计数器

每一个Java线程都有一个程序计数器,用于保存程序执行到当前方法的哪一个指令,它是线程私有的。
此内存区域是唯一一个在VM Spec中没有规定任何OutOfMemoryError情况的区域。
2、Java虚拟机栈
通常说的栈指的就是Java栈,主管Java程序的运行。栈是在线程创建时创建,线程结束栈内存就释放掉了,不存在垃圾回收问题,线程一结束该栈就Over,与程序计数器一样,它的生命周期也是与线程相同,它是线程私有的。
基本类型的变量、实例方法、引用类型变量都是在函数的栈内存中分配。
栈描述的是Java方法调用的内存模型:每个方法被执行的时候,都会同时创建一个帧(Frame)用于存储本地变量表、操作栈、动态链接、方法出入口等信息。每一个方法的调用至完成,就意味着一个帧在VM栈中的入栈至出栈的过程。本地变量表存放了编译期可知的各种标量类型(boolean、byte、char、short、int、float、long、double)、对象引用(不是对象本身,仅仅是一个引用指针)、方法返回地址等
这个区域规定了2种异常:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果VM栈可以动态扩展(VM Spec中允许固定长度的VM栈),当扩展时无法申请到足够内存则抛出OutOfMemoryError异常。
(1)抛出StackOverflowError异常的代码(递归调用):
public class StackDemo1
{
static void sayHello()
{
System.out.println("AAAAA");
sayHello();
} public static void main(String[] args) {
sayHello();
}
}
3、本地方法栈
本地方法栈和Java虚拟机栈发挥的作用是类似的,只不过Java虚拟机栈为虚拟机运行原语服务,而本地方法栈是为虚拟机使用到的 native 服务。
它的实现语言、结构、方式没有强制规定,甚至有的虚拟机把它和java虚拟机栈合二为一了,例如Sun Hotspot。
和java虚拟机栈一样,这个区域也会抛出StackOverflowError异常和OutOfMemoryError异常。
4、堆
Java7之前:
一个JVM实例只存在于一个堆内存中,堆内存的大小是可以调节的。类加载器读取了类文件之后,需要把类、方法、常变量放到堆内存中,
保存所有引用类型的真实信息,以方便执行器执行。
堆内存逻辑上分为:新生区、养老区、永久区。(实际上永久区被称为非堆内存)
新生区:伊甸区(Eden Space)、幸存0区(Survivor 0 Space)、幸存1区(Survivor 1 Space)
当new 一个对象,该对象被放入伊甸区(Eden),创建的对象越来越多,伊甸区(Eden)快满的时候启动一种轻垃圾回收(Minor GC),未被回收的对象被放入幸存0区(Survivor 0),Eden被清空;当幸存0区快满了,未被回收的对象被放入幸存1区(Survivor 1),Survivor 0和Eden被清空;Survisor 0与Survivor 1交换角色,如此循环往复。如果对象的复制次数达到16次,该对象就会被送到养老中。当养老区快满的时候触发一个重量级的GC(Major GC),清理之后还是无法再保存对象,就会产生OOM异常(OutOfMemoryError)。
Survisor 0 和 Survivor 1会一直调换角色,谁是空的谁就是Survivor 1区。



5、方法区
方法区是所有线程共享的,通常用来储存装载的类的元结构信息。垃圾回收很少发生;
比如:运行时常量池 + 静态变量 + 常量 + 字段 + 方法字节码 + 在类/实例/接口初始化用到的特殊方法等。
通常和永久区关联在一起(Java7),具体的跟JVM的实现和版本有关。Java8以后,变为了MetaSpace(元空间),直接使用的物理内存,垃圾回收运行的概率变得更低。
JVM 运行时数据区 (三)的更多相关文章
- Jvm运行时数据区
一:运行时数据区 Java虚拟机在执行Java程序的过程中会把它管理的内存分为若干个不同的数据区域.这些区域有着各自的用途,一级创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户 ...
- JVM总结(一):概述--JVM运行时数据区
大三下,趁着寒假重温一遍JVM,准备在一个系列来总价一下学习JVM的整个过程.争取在接下来的一个星期内更新完这一个系列,然后回家过年. JVM运行时数据区 线程私有的数据区 程序计数器 虚拟机栈 本地 ...
- JVM运行时数据区与JVM堆内存模型小结
前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 ...
- JVM运行时数据区和垃圾回收机制
最近参考各种资料,尤其是<深入理解Java虚拟机 JVM高级特性和最佳实践>,大牛之作.把最近学习的Java虚拟机组成和垃圾回收机制总结一下. 你不会的都是新知识,学无止境,每天进步一点点 ...
- Java内存管理:Java内存区域 JVM运行时数据区
转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...
- Jvm运行时数据区 —— Java虚拟机结构小记
关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...
- Java中的字符串常量池和JVM运行时数据区的相关概念
什么是字符串常量池 JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池 工作原理 当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量 ...
- JVM运行时数据区及对象在内存中初始化的过程
JVM运行时数据区 Java虚拟机所管理的内存区域,也称为运行时数据区,分为以下几个运行时数据区,如图所示 程序计数器:当前程序所执行字节码的行号指示器 程序计数器(Program Counter R ...
- JVM 运行时数据区(二)
@ 目录 运行时数据区 共享区 堆区 方法区 隔离区 虚拟机栈 栈帧 本地方法栈 程序计数器 运行时数据区 JVM 运行时数据区主要分为5块 方法区 JDK1.8以后叫做元数据区(Metaspace) ...
随机推荐
- C#中的 new Random()
在C#中,产生随机数常用大方法是 new Random().Next(1,10)等方法. 但是仔细发现会有个问题: 看代码: ; i < ;i++ ) { Console.WriteLine(, ...
- 修改maven项目的编译版本
在pom.xml中添加如下代码 <build> <!-- 配置了很多插件 --> <plugins> <plugin> <groupId>o ...
- PL/SQL Job
1. 鼠标右键点击 jobs 弹出 Create Job 对话框,如下图: 2. 在对话框中输入相应的值,如下图: 其中: What ——作业执行时将要调用的存储过 ...
- Linux 创建用户 限制SFTP用户只能访问某个目录
Linux 限制SFTP用户只能访问某个目录 1. 新建用户并设置密码 > useradd suser > passwd suser // 输入密码 2. 设置sshd配置文件 > ...
- ABAP IMPORT&EXPORT的用法
1含有事务码 1.1 不注入参数,直接调用 CALL TRANSACTION 'SUIM' AND SKIP FIRST SCREEN. 1.2 注入参数, SET PARAMETER ID: '屏幕 ...
- java.lang.NoClassDefFoundError: net.tsz.afinal.FinalHttp
java.lang.NoClassDefFoundError: net.tsz.afinal.FinalHttpat com.hbjyjt.oa.utils.i.<init>(HttpRe ...
- Spring-data-redis redis
什么是spring-data-redis spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用 ...
- tomcat中的类加载机制
Tomcat中的类加载机制符合JVM推荐的双亲委派模型,关于JVM的类加载机制不多说,网上很多资料. 1. Tomcat类加载器过程. tomcat启动初始化阶段创建几个类加载器: private v ...
- spring boot 中使用 Redis 与 Log
spring boot + mybatis + redis 配置 1.application.yml #配置访问的URLserver: servlet-path: /web port: spring: ...
- 在 Android Studio 上调试数据库 ( SQLite ) (转)
转自:http://c.colabug.com/thread-1781696-1-1.html 以前 Eclipse 时代,调试 SQLite 都是将数据库文件导出到电脑,然后再用软件打开查看.现在我 ...