深入理解JVM(一)虚拟机内存
一 、前言
JVM是什么,我想诸位肯定都清楚。
好吧,我还是简答说一下JVM即Java虚拟机(够简单吧 233333)。
虽然说,所有抛开操作系统,讲虚拟机的内容,都是耍流氓。但是,贫僧不修善果,就爱杀人放火,就爱耍流氓。好吧,扯远了。
言归正传,JVM这是第三遍重温了。第一遍读时,还是在飞机上读的,就记得飞机上的阳光很刺眼,肚子很难受,从书中汲取的知识很少。第二遍读时,是在做地铁时看完的。地铁很挤,书很好看。如今,距离上次读完,已有一载有余,一年发生了很多事,朋友离开,公司散伙,亲人重病。期间明白了很多道理。一个是,一定要好好的关爱你的亲人。一个是,对于人重要的东西只有两样,健康的身体,以及独立的灵魂。最近读完了史铁生的《我与地坛》对这两点也是感触颇多。
又扯远了。下面进入正题。
二、 内存划分
总体划分如下:

三、运行时数据区域
运行时数据区域,我们可以分为线程私有的数据区域,与线程共享的数据区域。线程私有,也就是线程内的数据,是能且仅能让创建它的线程访问。线程共享,是任何线程都可以访问共享的此数据。
1、线程私有
(1)程序计数器
- 程序计数器可以视为当前线程执行的字节码行数指示器。(程序计数器是什么)
- 多线程运行时,本质上,是线程的轮流切换。这一点,如果对操作系统还有记忆的同学,可能感觉如此之熟悉,是的单核的操作系统中,CPU在执行多任务时,就是将每个任务都执行一点,宏观意义上来讲,就达到了多任务同时进行的感觉。而当虚拟机中多线程执行时,线程执行了一半,就执行其他线程了,又一次回到此线程时,如何确保可以继续执行线程,这里,就是程序计数器的意义所在了。(为什么要有程序计数器)
- 一个线程有且仅有一个程序计数器。(有第一点和第二点而得出的结论)
(2)java虚拟机栈
[1]栈帧
在每个方法被创建时,同时也会创建一个栈帧。
一个方法被调用到被执行完毕的过程,就是一个栈帧,在虚拟机栈中,从入栈到出栈的过程。
[2]栈帧的数据结构
一个栈帧中包括了局部变量表、操作数栈、动态链接、以及方法出口
这里我们详细的来说一下他的局部变量表
1)存放了基础数据类型。
2)存放了对象的引用
3)存放了returnAddress:指向一条直字节码令的地址
[3]基础数据类型扩展
重温此结的时候,突然想到了基础数据的一个共同点。
他们都可以被转为为int
public static void main(String[] args) {
int i = 1;
short s = 1;
float f = 1f;
double d = 1;
long l = 1L;
char c = 63;
byte b2 = 1;
boolean b = 1;
System.out.println("输出char>>"+c);
}
以上代码在编译期间,最后一行,也就是boolean会报错,但是学过c或c++的都知道,bool类型,本质上,true为1,false为0。
而其他的都是可以正常赋值的。
char的赋值,大家可以猜猜,输出的是多少。是63的ASCII值 "?"
输出char>>?
(3)本地方法栈
本地方法栈,他与虚拟机栈类似(数据结构以及功能等方面)
不同的是,虚拟机栈执行的是java方法(编译出的字节码)。而本地方法栈执行的是Native方法。比如:
Thread类中的
private native void start0();
//调用dll或其他文件内方法
public native static void Hello();
有些虚拟机,他的本地方法栈与虚拟机栈会合并。
2、线程共享
(1)java堆
- 堆内的数据,是所有线程共享的。
- 几乎所有的对象实例都在此存储,因此,java堆又被称为GC堆
(2)方法区
[1]方法区的数据结构
类信息:包括了类的版本、类中的字段、方法、接口以及常量池。常量池在编译期就会确认并生成。
常量。
静态常量。
编译后的代码。
[2] 逻辑上是堆的一部分,但他的别名是非堆。
2、非运行时数据区域
(1)直接内存
NIO使用此块内存,以提高读写性能
四、参考
《深入理解java虚拟机》
深入理解JVM(一)虚拟机内存的更多相关文章
- 深入学习重点分析java基础---第一章:深入理解jvm(java虚拟机) 第一节 java内存模型及gc策略
身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 ...
- 理解JVM之Java内存区域
Java虚拟机运行时数据区分为以下几个部分: 方法区.虚拟机栈.本地方法栈.堆.程序计数器.如下图所示: 一.程序计数器 程序计数器可看作当前线程所执行的字节码行号指示器,字节码解释器工作时就是通过改 ...
- 深入理解JVM - 1 - Java内存区域划分
作者:梦工厂链接:https://www.jianshu.com/p/7ebbe102c1ae来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. Java与C++之间有一堵 ...
- 深入理解JVM,虚拟机类加载机制
类加载过程概览 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括以下7个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Re ...
- 深入理解JVM(6)——Java内存模型和线程
Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...
- 深入理解JVM(二)Java内存区域
2.1 C.C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理 2.2 JVM运行时数据区:方法区.堆(运行时线程共享),虚拟机栈.本地方法栈.程序计数器(运行时线程隔离,私有) 1 ...
- 深入理解JVM(一) -- 自动内存管理机制
Java运行时数据区域分为:程序计数器,虚拟机栈,本地方法栈,Java堆,方法区,运行时常量池,直接内存,结构如下: 1.程序计数器: 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示 ...
- 深入理解JVM(四) -- 垃圾内存回收的判定方法和内容
上一篇文章我们学到了对象在内存中是如何存储的已经是如何被访问的,这篇文章将介绍当内存空间不够时,虚拟机将怎样判定对象可不可以被回收已经哪些地方会发生回收. 垃圾回收主要(不是全部)发生在堆内存中,当一 ...
- 理解JVM之java内存模型
java虚拟机规范中试图定义一种java内存模型(JMM)来屏蔽掉各种硬件和操作系统内存访问差异,以实现让java程序在各种平台都能打到一致的内存访问效果.所以java内存模型的主要目标是定义程序中各 ...
- 深入理解JVM(一)--Java 内存区域
一. 运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域: ...
随机推荐
- Method and Apparatus for Providing Highly-Scalable Network Storage for Well-Gridded Objects
An apparatus comprising a plurality of storage nodes comprising a plurality of corresponding storage ...
- 第一次react-native项目实践要点总结 good
今天完成了我的第一个react-native项目的封包,当然其间各种环境各种坑,同时,成就感也是满满的.这里总结一下使用react-native的一些入门级重要点(不涉及环境).注意:阅读需要语法基础 ...
- C++于public、protected和private说明(From MSDN)
public(C# 參考): https://msdn.microsoft.com/zh-cn/library/yzh058ae.aspx protected(C# 參考):https://msdn. ...
- Qt5官方demo分析集10——Qt Quick Particles Examples - Emitters
此系列的所有文章都可以在这里查看http://blog.csdn.net/cloud_castle/article/category/2123873 前段时间去听了Qt在北京的开发人员大会,感觉QML ...
- Web前端开发人员实用Chrome插件收集
越来越多的前端开发人员喜欢在Chrome里开发调试代码,Chrome有许多优秀的插件可以帮助前端开发人员极大的提高工作效率.尤其Chrome本身是可以登录的,登录后你所有的插件都会自动同步到每一个登录 ...
- 【剑指Offer学习】【面试题4 : 替换空格】
题目: 请实现一个函数,把字符串中的每个空格替换成"%20",例如“We are happy.”,则输出“We%20are%20happy.”. 以下代码都是通过PHP代码实现. ...
- .net与.net core学习目录
.net C#调用python 模拟请求(模拟header/gzip解压/泛型) C#控制台关闭之前做一些操作 C# 元组.匿名对象.ref&out DataTable转换为Entity(反射 ...
- php 将一个二维数组中两个相同的value 相同 指定值相加
array(3) { [0]=> array(7) { ["mlid"]=> int(1) ["num"]=> int(1) ["c ...
- Win8 Metro(C#)数字图像处理--2.39二值图像投影
原文:Win8 Metro(C#)数字图像处理--2.39二值图像投影 [函数名称] 二值图像投影 ImageProjection(WriteableBitmap src) ...
- 笔记:Advanced Installer 打包Web应用
原文:笔记:Advanced Installer 打包Web应用 公司要做一款增值税小产品,区别于ACME,本产品核心只有销项部分,面对的客户群是小企业,单税盒单开票机..... 我要做的主要有以下几 ...