深入理解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虚拟机所管理的内存将会包括以下几个运行时数据区域: ...
随机推荐
- 矩阵微分(matrix derivatives)
关于矩阵求导,得到的导数则是矩阵形式:关于矢量求导,得到的导数则是矢量形式:关于标量求导,得到的仍是标量形式.也即关于谁求导,得到的导数形式便和谁的维度信息一致. fx = f(x) grad = n ...
- 用Delphi即时判断当前的网络的连接方式
判断网络的是否连接或者连接方式,比较重要的一点就是是不是即时判断,如果你明明无连接,判断出来却说你有,连接上了,却说你还未连接,下面要介绍的两个方法中 InternetGetConnectedStat ...
- 阿凡达是脸,教你的脸在线(包括URL和使用)
官方网站:http://www.mcdonalds.at/avatar/ 英文版本号:lid=finland" target="_blank">http://www ...
- 构建自己的PHP框架(路由)
完整项目地址:https://github.com/Evai/Aier 上一篇中我们已经建立了一个空的 Composer 项目,本篇将讲述如何构建路由. 下面我们就开始自己来构建路由,先去 GitHu ...
- c# windows程序调用本地输入法
原文:c# windows程序调用本地输入法 好久没写博客了,今天写了一个DEMO,在WINform程序中调用本地输入法,并在窗体中显示出来.其中使用到了很多API,现把代码贴出来,供大家参考 ...
- 基于Netbeans的安卓Android开发环境配置 - CSDN博客
原文:基于Netbeans的安卓Android开发环境配置 - CSDN博客 基于Netbeans的安卓Android开发环境配置 一.准备工作 NetBeans 勾选网页中的Accept-选择对应系 ...
- WPF/Silverlight 页面绑定Model验证机制升级版
关于WPF/Silverlight的数据验证,想必大家都不陌生了. 各大牛的博客里都不泛对这方面讨论的文章. 个人比较赞赏 JV9的“Silverlight实例教程”里的Validation数据验证. ...
- aspx页面@Page指令解析
@Page指令位于每个ASP.NET页面的顶部,告诉ASP.NET这个具体页面使用什么属性,以及该页面继承的用户控件.ASP.NET页面@Page指令属性有:AspCompat.Async.Async ...
- 在 __CC_ARM 编译器环境下,使用$Sub$$ 与 $Super$$ 的“补丁”功能
$Sub$$ 与 $Super$$ 的“补丁”功能(详见 ARM® Compiler v5.06 for µVision® armlink User Guide): 这是一种特殊模式:用于有一个已经存 ...
- Delphi中close与Terminate方法的区别
在有多个Form窗体时可以体现出来.用close是只关闭本窗体,而用Application.terminate是关闭整个程序,包括所有窗体.(1)当Close是一个主窗体时,程序会退出.Close会发 ...