Java 虚拟机运行时数据区
运行时数据区域包括如下几个区域:
1、程序计数器
英文为 Program Counter,简称 PC,此内存区域存储指令位置,为每个线程独占。
取PC中的值,找到对应位置的指令,然后执行该指令,然后将PC++。
2、堆
Heap,java 线程间共享的一块内存区域,所有对象实例以及数组在此区域分配。
堆内存逻辑分区:
新生代,new/young;老年代,odl/tenured,两者默认比例 new : old 为 1:3。
新生代,又划分为Eden区,suvivor0/from,suvivor1/to,三者比例默认为 8:1:1。
一个对象 new 出来后,首先尝试往 stack 上分配,stack 上分配不下,会进入 Eden区。一次GC垃圾回收幸存后进入 survivor0,再一次GC垃圾回收幸存后进入 survivor1,经过复制年龄限制后,才会进入 old 区。
为什么要给堆进行分代?
因为对象的生命周期不同,并且大部分对象是临时对象;给堆分代主要是为了优化GC性能。
3、Java 虚拟机栈
JVM stacks,每个线程对应一个栈,与线程同时创建,存储方法栈帧 frames。
栈帧 frame,存储的是:
local variables,局部变量表,方法内部使用的变量,方法参数也存储在此。
operand stacks, 操作数栈,每个局部变量都有自己的 operand stacks,通过指令查看。
dynamic linking,动态链接,常量池里的符号链接,方法名,类型等,看它是否已经解析,有的话直接用,没有的话,就进行动态解析。
return address,方法出口,比如方法 m 调用方法 n,n执行完之后,如果n有返回值,那么把返回值放到哪里,执行结束后应该回到哪个位置继续执行,这个位置叫return address。
4、本地方法栈
native method stacks,本地方法,C 和 C++方法。
5、直接内存
Direct Memory, jdk1.4版本之后增加的,为了提高IO效率,由用户空间直接去访问内核空间的内存,省略了IO拷贝到JVM的过程,实现了零拷贝 zero copy。
6、方法区
method area,线程间共享,存储每个类的结构信息 per-class structure。
Hotspot JVM JDK 1.8之前叫 perm space 永久区,字符串常量位于此区域,Full GC 不会清除此区域。JDK 1.8 之后叫 meta space 元数据区,使用本地内存来存储,如果没有指定这个参数,元空间会在运行时根据需要动态调整。不会再发生 java.lang.OutOfMemoryError: PermGen 异常。FGC会清理此区域,而字符串常量已被移动到堆中。
Java 虚拟机运行时数据区相关推荐
- 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区
Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...
- 笔记:Java虚拟机运行时数据区
Java虚拟机在执行Java程序的过程中会把它管的内存划分为以下若干个不同的区域: 1.程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器:由于Java虚拟机的 ...
- Java虚拟机运行时数据区
将从<深入理解Java虚拟机:JVM高级特性与最佳实践>和 The Java® Virtual Machine Specification 中对于Java运行时数据区的描述整理记录一下 从 ...
- c++指定在某一线程运行_深入理解Java虚拟机-运行时数据区
在Java虚拟机的概念中,运行时数据区又被称为Java内存区域.主要由线程私有的程序计数器.虚拟机栈和本地方法栈以及线程共享的堆和方法区组成. 程序计数器 程序计数器在Java内存中占据的空间比较小, ...
- Java虚拟机 —— 运行时数据区
Java虚拟机内存,是指JVM的运行时数据区域,主要分为:方法区.堆.虚拟机栈.本地方法栈.程序计数器.其中方法区和堆为索引线程的共享数据区,而虚拟机栈.本地方法栈.程序计数器为线程隔离的数据区. 程 ...
- Java -----JVM运行时数据区
一.JVM体系结构 想要了解运行时数据区,先关注一下JVM的体系结构,知道数据区在JVM的整体位置和作用. 二.JVM运行时数据区 1.程序计数器 一块较小的内存空间,它是当前线程所执行的字节码的行号 ...
- Java虚拟机2:Java 运行时数据区
前言快速到底 如果有人问你 java 的内存区域分为哪些,可能很多人会说:堆.栈.方法区--.我个人理解从开发者的角度 Java 能够涉及到"内存区域"的大致有两处:第一,java ...
- java运行时异常与一般异常有何异同_JVM | 虚拟机运行时数据区域划分和使用详解...
引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理和垃圾收集方面作出比较. 对于C++而言,程序员既要做程序 ...
- [JVM]了断局: “运行时数据区“理论梳理
Table of Contents 一.前言 二.运行时数据区 2.1.程序计数器 2.2.Java堆 2.3.方法区 2.4.运行时常量池 2.5.直接内存 2.6.Java虚拟机栈 2.7.本地方 ...
最新文章
- mysql 计算排名,生成排行榜
- 关于 sql server 基本使用的建议
- 黑马lavarel教程---7、文件上传
- 国内云存储产品应用简介
- SAP UI5 初学者教程之十 - 什么是 SAP UI5 应用的描述符 Descriptor 试读版
- 你的第一个Django程序
- 学习Spring Boot:(五)使用 devtools热部署
- 到了姥姥家我在小点点c++
- pytorch: MaxUnpool2d 与 Upsampling
- 【整理】牛客网编程题-前端篇(入门难度)
- python中的字符类型_八、 python中的数据类型——字符串
- 微型计算机系统中传感器的作用,一文读懂传感器原理、作用及技术特点
- matlab字号单位是磅吗,Office软件中字体“号”与“磅”的关系
- 计算机专业必须用英语口语要求,哪些专业需要英语口语考试
- 图像检索:INS视觉检索
- Mathematica(26)-在软件中插入图片
- R语言基础 期中考试
- express : 无法加载文件 C:\Users\HP\AppData\Roaming\npm\express.ps1,因为在此系统上禁止运行脚本.
- 国外stripe支付,超简单几行代码搞定
- 美国大学计算机专业排名2019,2019年美国大学计算机排名