JVM系列(一)--JVM运行时数据区
随着时间的推移,我觉得有必要将一些之前相对模糊但是对自身技术提高会有帮助的原理、概念、实现进行一下系统的整理,所以就从JVM系列开始吧。
本系列主要参考《Java虚拟机规范(第二版)》、周志明先生写的《深入理解Java虚拟机》,具体虚拟机主要参照Hotspot。
一.Runtime Data Areas
在运营及维护我们的站点或者应用时,需要针对crash或者内存溢出、内存泄露定位问题以及调优等工作,而Java这门语言或者是平台提供了一个可以将内存分配、回收屏蔽掉的JVM,所以我们非常有必要了解一下JVM的运行时数据分区情况。
图1-Runtime Data Areas
从上图可知,我们每创建一个Tread,JVM都会为该线程分配一个Program Counter Register、一个Java Virtual Machine Stack、一个Native Method Stack,以上三个区域都是线程私有,而Heap与Method Area是线程共享。
我们分别了解一下每个区域的作用、存储的数据、线程私有\共享情况、可能出现的错误或异常。
1.Program Counter Register(程序计数器)
a.作用:被字节码解释器用来选取下一条需要执行的字节码指令。我们需要明确一点,Java虚拟机的多线程机制是通过线程轮流切换并分配处理器执行时间的方式实现的,即在某一个特定的时刻,一个处理器只会执行一条线程中的指令,从这个层面,该区域需要线程私有。
b.存储的数据:以当前线程正在被执行的是Java方法还是Native方法。
(1).Java方法:本线程要被执行的下一条字节码指令地址。
(2).Native方法:空(Undefined)。
c.线程私有/共享情况:线程私有,每一个线程都持有一个程序计数器。
d.错误或异常:虚拟机规范中未规定该区域会抛出任何异常或错误。
2.Java Virtual Machine Stack(虚拟机栈)
a.作用:从名字上就可以猜测,这是一个Stack。该区域描述的是Java方法执行的内存模型:
每个Java方法执行被执行时都会常见一个栈帧(Stack Frame),该Stack Frame存储了方法的局部变量表、操作栈、动态链接、方法出口等信息。每一个Java方法从被调用到执行完成都对应着一个Stack Frame从进Stack到出Stack的过程。
b.存储的数据:本区域就是一个Stack结构,存储的就是一个个被执行的Stack Frame.
c.线程私有/共享情况:线程私有。
d.错误或异常:两种异常(更精确的说是Error)
(1).StackOverflowError:请求深度超过JVM允许的深度时抛出,简单点理解就是这个Stack满了而已。
(2).OutOfMemoryError:无法申请到足够的内存时抛出。
4.Native Method Stack(本地方法栈)
这个区域的结构及作用与虚拟机栈类似,只是这个区域描述的是Native方法执行的内存模型,所以HotSpot干脆把Java Virtual Machine Stack与Native Method Stack合并了。这个区域也是线程私有的,也会抛出StackOverflowError与OutOfMemoryError.
5.Java Heap(Java堆)
a.作用:存放对象实例(包括对象实例与数组)。
b.存储的数据:对象实例。
c.线程私有/共享情况:线程共享。
d.错误或异常:OutOfMemoryError.
该区域是垃圾收集器管理的主要区域,所以为了更快的分配内存、更好的进行垃圾回收,Java Heap还可以进行细分:新生代与老年代。如果在细分的话有新生代又由Eden空间、From Survivor空间、To Survivor空间组成。
6.Method Area(方法区)
a.作用:存储被虚拟机加载的类信息、常量、静态变量、JIT编译后的代码。
b.存储的数据:同上
c.线程私有/共享情况:线程共享
d.错误或异常:OutOfMemoryError.
7.Runtime Constant Pool(运行时常量池)
a.作用:存储编译期生成的各种字面量和符号引用
b.存储的数据:同上
c.线程私有/共享情况:线程共享
d.错误或异常:OutOfMemoryError.
该区域是Method Area的一部分。
二.Some Options
JVM Options:
参数名 | 含义 | 默认值 | 说明 |
-Xms | Java Heap初始大小 | 物理内存的1/64,但是小于1GB | |
-Xmx | Java Heap最大值 | 物理内存的1/4,但是小于1GB | |
-Xmn | 新生代大小 | 该区域由Eden空间、From Survivor空间、To Survivor空间组成 | |
PermSize | 方法区初始大小 | 物理内存的1/64 | |
MaxPermSize | 方法区的最大值 | 物理内存的1/4 | |
-Xss | JVM Stack大小 |
JDK5.0之前默认256K,之后默认1M. 在物理内存不变的情况下,可以通过减小该值来获取更大的线程创建数量。 |
|
NewRatio | 新生代与老年代的比值 | 如果-XX:NewRatio=4表示新生代与老年代的比值为1/4 | |
SurvivorRatio | Eden空间与Survivor空间的比值 | ||
LargePageSizeInBytes | 内存页的大小 | 用法-XX:LargePageSizeInBytes=128m | |
UseFastAccessorMethods | 原始类型的快速优化 | ||
DisableExplicitGC | 忽略来自System.gc()方法触发的垃圾收集 | 默认关闭 | |
Help Options
-XX:+PrintGC |
输出形式: [GC 118250K->113543K(130112K), 0.0094143 secs] |
||
-XX:+PrintGCDetails |
输出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs] |
||
-XX:+PrintGCTimeStamps | |||
-XX:+PrintGC:PrintGCTimeStamps |
可与-XX:+PrintGC -XX:+PrintGCDetails混合使用 输出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs] |
||
-XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期间程序暂停的时间.可与上面混合使用 | 输出形式:Total time for which application threads were stopped: 0.0468229 seconds | |
-XX:+PrintGCApplicationConcurrentTime | 打印每次垃圾回收前,程序未中断的执行时间.可与上面混合使用 | 输出形式:Application time: 0.5291524 seconds | |
-XX:+PrintHeapAtGC | 打印GC前后的详细堆栈信息 | ||
-Xloggc:filename |
把相关日志信息记录到文件以便分析. 与上面几个配合使用 |
||
-XX:+PrintClassHistogram |
garbage collects before printing the histogram. | ||
-XX:+PrintTLAB | 查看TLAB空间的使用情况 | ||
XX:+PrintTenuringDistribution | 查看每次minor GC后新的存活周期的阈值 |
Desired survivor size 1048576 bytes, new threshold 7 (max 15) |
转载于:https://blog.51cto.com/paladinapple/1317874
JVM系列(一)--JVM运行时数据区相关推荐
- JVM(类加载、运行时数据区、堆内存、方法区、本地接口、执行引擎和垃圾回收)java虚拟机(JVM)的超详细知识点
JVM虚拟机 一.JVM的概述 1.为什么要学习JVM 2.虚拟机 3.JVM的作用 作用 特点 4.JVM的位置 5.JVM的分类 6.各个组成部分的用途 7.Java 代码的执行流程 8.JVM ...
- JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈
运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...
- JVM内存区域(运行时数据区)划分
前言: 我们每天都在编写Java代码,编译,执行.很多人已经知道Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文 ...
- 【JVM学习笔记】运行时数据区
一.运行时数据区与线程概述 1 运行时数据区的结构 其中方法区和堆是随着虚拟机的创建而创建摧毁而摧毁,为各个线程所共用.而程序计数器(PC).本地方法栈(NMS).虚拟机栈(VMS)则是随着某个线 ...
- Java #JVM(HotSpot) 运行时数据区 #程序计数器(PC寄存器)#虚拟机栈(栈帧:局部变量表、操作数栈……)#堆……
目录 JVM中线程的说明 程序计数器(PC寄存器) 虚拟机栈 · 栈帧 ·· 局部变量表 ·· 操作数栈 ·· 动态链接 ·· 方法返回地址 ·· 本地方法栈 堆 · 查看堆的大小 · 堆的默认大小 ...
- Java程序员必知必会之JVM运行时数据区
JVM类加载概述 JVM垃圾回收概述 运行时数据区概述 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要 ...
- JVM 运行时数据区(二)
一.堆 一个进程对应 JVM 的一个实例,一个 JVM 实例只有一个运行时数据区. 1.1.堆的核心概述 Java 堆区在 JVM 启动时被立即创建,其空间大小也就确定了,是 JVM 管理的最大一块内 ...
- 【jvm系列-04】精通运行时数据区共享区域---堆
JVM系列整体栏目 内容 链接地址 [一]初识虚拟机与java虚拟机 https://blog.csdn.net/zhenghuishengq/article/details/129544460 [二 ...
- JVM系列之运行时数据区
1.运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直存在,有些区域则是 ...
- 20张图助你了解JVM运行时数据区,你还觉得枯燥吗?
我们的JVM系列已经断更好几天了,小伙伴们在后台疯狂私信阿Q,想看后续内容,今天它来了.相信大家在上篇文章中已经对类加载子系统有了清晰的认识,接下来就让我们来揭开"运行时数据区"的 ...
最新文章
- python加密库_python基于pyDes库实现des加密的方法
- 2015年11月 广州深圳 MVP 线下活动
- 2016年 CodePen 最热门的前端代码 Top 100
- 数据结构与算法 / 红黑树
- javascript学习系列(22):数组中的reduceRight法
- css 单行/多行文字垂直居中问题
- 第10章 部署Exchange2010 部署边缘服务器
- Active Record Query Interface 数据查询接口(界面) 看到第8节。
- 软件设计师12-数据库(范式)
- 剑指offer面试题[9-2]-变态跳台阶
- 51nod 1428 活动安排问题 (贪心+优先队列)
- html里用js实现随机抽奖,javascript实现随机抽奖功能
- 自制solidworks图框步骤_SolidWorks教你如何快速制作工程图模板
- 网络带宽测试工具iperf3(arm<->PC)
- 封装lodash和ramda中常用方法并发布自己的npm包
- detached entity passed to persist:xxx;
- ChatGPT 角色扮演调教文案收集
- mysql怎么做库存管理_电商中的库存管理实现-mysql与redis
- 玩转NVIDIA Jetson AGX Xavier
- 深入理解java虚拟机第3版 周志明
热门文章
- 计算器java程序设计报告总体设计,java程序设计实验报告-计算器
- java socket 线程池_java socket编程的一个例子(线程池)
- bigdecimal 保留两位小数_Python的保留小数及对齐
- jsp通过易宝方式实现在线支付
- poj 2031Building a Space Station(几何判断+Kruskal最小生成树)
- 台式计算机有什么配置,目前台式电脑的主流配置有哪些?
- linux /proc 详解
- 怎么在html显示已登录状态,jQuery Ajax 实现在html页面实时显示用户登录状态
- unity如何往下挖地形_Unreal Engine地形系统辨析(一)
- python数据预处理 重复行统计_Python数据分析之数据预处理(数据清洗、数据合并、数据重塑、数据转换)学习笔记...