深入理解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虚拟机所管理的内存将会包括以下几个运行时数据区域: ...
随机推荐
- jquery 源码学习(三)
jQuery源码分析-03构造jQuery对象-源码结构和核心函数,需要的朋友可以参考下. 作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 毕竟 ...
- Redis中的管道(PipeLine)与事物(Transactions)
Redis中的管道(PipeLine)与事物(Transactions) 序言 Redis中的管道(PipeLine)特性:简述一下就是,Redis如何从客户端一次发送多个命令,服务端到客户端如何一次 ...
- Python 格式化输出 —— 小数转化为百分数
比如将 0.1234 转化为 12.34% 的形式: rate = .1234 print('%.2f%%' % (rate * 100)) 第一个百分号和 .2f 相连,表示浮点数类型保留小数点后两 ...
- Net锁
Net分布式锁的实现 序言 我晚上有在公司多呆会儿的习惯,所以很多晚上我都是最后一个离开公司的.当然也有一些同事,跟我一样喜欢在公司多搞会儿.这篇文章就要从,去年年末一个多搞会的晚上说起,那是一个夜黑 ...
- Clustered filesystem with membership version support
A computer system with read/write access to storage devices creates a snapshot of a data volume at a ...
- 最近更新电脑管家开机速度约慢很多木有?$计算机管理-废话$.qmgc
最近更新电脑管家开机速度约慢很多木有? 一旦开机速度是几十秒,由于前几天更新电脑管家,大约几十秒钟成为一个点开机时间! 同样在一个多垃圾清理桌面图标! 右键菜单也看不到属性 须要到下面位置查看: wa ...
- XBMC 最新版本号错误
1. Syntax error: "(" unexpected 改动 tools/depends下的makefile.include 将NDK_VER=0x9d
- 关于iis里面 .net framework 版本的切换
然而,即便这样还是不够的 在iis上浏览网站会报以下错误: 这是什么原因呢?这是因为应用程序池中没有使用asp.net v4.0 网站程序是用v4.0写的,所以我们要用4.0的程序池版本,当前应用程序 ...
- Redis (一)Redis简介、安装部署
Redis是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案. 既然是key-value,对于Java开发来说更熟悉的是Map集合.那就有问题了,有M ...
- OpenGL(五) 三维变换之模型视图矩阵
计算机三维图形学中,一个基本的任务是如何描述三维空间中一个物体位置的变化,也就是如何 描述物体的运动.通常情况下,物体位置的变化包含三个基本的变化:平移.旋转和缩放,物体的运动也可以用这三个基本的运动 ...