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 运行时数据区 (三)的更多相关文章

  1. Jvm运行时数据区

    一:运行时数据区 Java虚拟机在执行Java程序的过程中会把它管理的内存分为若干个不同的数据区域.这些区域有着各自的用途,一级创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户 ...

  2. JVM总结(一):概述--JVM运行时数据区

    大三下,趁着寒假重温一遍JVM,准备在一个系列来总价一下学习JVM的整个过程.争取在接下来的一个星期内更新完这一个系列,然后回家过年. JVM运行时数据区 线程私有的数据区 程序计数器 虚拟机栈 本地 ...

  3. JVM运行时数据区与JVM堆内存模型小结

    前提 JVM运行时数据区和JVM内存模型是两回事,JVM内存模型指的是JVM堆内存模型. 那JVM运行时数据区又是什么? 它包括:程序计数器.虚拟机栈.本地方法栈.方法区.堆. 来看看它们都是干嘛的 ...

  4. JVM运行时数据区和垃圾回收机制

    最近参考各种资料,尤其是<深入理解Java虚拟机 JVM高级特性和最佳实践>,大牛之作.把最近学习的Java虚拟机组成和垃圾回收机制总结一下. 你不会的都是新知识,学无止境,每天进步一点点 ...

  5. Java内存管理:Java内存区域 JVM运行时数据区

    转自:https://blog.csdn.net/tjiyu/article/details/53915869 下面我们详细了解Java内存区域:先说明JVM规范定义的JVM运行时分配的数据区有哪些, ...

  6. Jvm运行时数据区 —— Java虚拟机结构小记

    关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...

  7. Java中的字符串常量池和JVM运行时数据区的相关概念

    什么是字符串常量池 JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池 工作原理 当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量 ...

  8. JVM运行时数据区及对象在内存中初始化的过程

    JVM运行时数据区 Java虚拟机所管理的内存区域,也称为运行时数据区,分为以下几个运行时数据区,如图所示 程序计数器:当前程序所执行字节码的行号指示器 程序计数器(Program Counter R ...

  9. JVM 运行时数据区(二)

    @ 目录 运行时数据区 共享区 堆区 方法区 隔离区 虚拟机栈 栈帧 本地方法栈 程序计数器 运行时数据区 JVM 运行时数据区主要分为5块 方法区 JDK1.8以后叫做元数据区(Metaspace) ...

随机推荐

  1. div下面多个a标签的点击事件,并且获取a的属性

    $('.fensiselect').on('click','a',function(){ var id= $(this).attr('fanid'); alert(id) })

  2. kdump内核

    什么是kdump?   kdump 是一种先进的基于 kexec 的内核崩溃转储机制.当系统崩溃时,kdump 使用 kexec 启动到第二个内核.第二个内核通常叫做捕获内核,以很小内存启动以捕获转储 ...

  3. linux centos 基本命令

    init 3 进入命令行界面. init 5 进入图形界面. ifconfig 查询IP地址. nmtui 设置网卡. su - root 是切换到root账号使用,使用的是root用户的环境变量:s ...

  4. fiddler常用操作

    fiddler常用操作 标签(空格分隔): fiddler fidrdler抓取https请求: fiddler是一个很好的抓包工具,但是默认的是抓取HTTP的,对于pc的https的会提示网页不安全 ...

  5. DRDS 概述

    DRDS 概述 更新时间:2017-08-04 13:53:50     分布式关系型数据库服务(Distributed Relational Database Service , 简称 DRDS ) ...

  6. spark算子之DataFrame和DataSet

    前言 传统的RDD相对于mapreduce和storm提供了丰富强大的算子.在spark慢慢步入DataFrame到DataSet的今天,在算子的类型基本不变的情况下,这两个数据集提供了更为强大的的功 ...

  7. struts2前后台传值的三种方法

    原文地址: http://laokaddk.blog.51cto.com/368606/1340816 多的不说,直接上代码; struts.xml代码: <?xml version=" ...

  8. 织梦栏目判断 seotitle的小bug

    有的栏目有seotitle(中文字符),有的没有,页面显示需要把seotitle放在括号中,所以进行了以下代码: {dede:field name="seotitle" runph ...

  9. 点击空白隐藏div

    window.onload = function(){ $(document).click(function(e){ $("#loginWrap").css('display',' ...

  10. Shell教程 之printf命令

    上一章节我们学习了 Shell 的 echo 命令,本章节我们来学习 Shell 的另一个输出命令 printf. printf 命令模仿 C 程序库(library)里的 printf() 程序. ...