一 、前言

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(一)虚拟机内存的更多相关文章

  1. 深入学习重点分析java基础---第一章:深入理解jvm(java虚拟机) 第一节 java内存模型及gc策略

    身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 ...

  2. 理解JVM之Java内存区域

    Java虚拟机运行时数据区分为以下几个部分: 方法区.虚拟机栈.本地方法栈.堆.程序计数器.如下图所示: 一.程序计数器 程序计数器可看作当前线程所执行的字节码行号指示器,字节码解释器工作时就是通过改 ...

  3. 深入理解JVM - 1 - Java内存区域划分

    作者:梦工厂链接:https://www.jianshu.com/p/7ebbe102c1ae来源:简书简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处. Java与C++之间有一堵 ...

  4. 深入理解JVM,虚拟机类加载机制

    类加载过程概览 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括以下7个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Re ...

  5. 深入理解JVM(6)——Java内存模型和线程

    Java虚拟机规范中定义了Java内存模型(Java Memory Model,JMM)用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果(“即Ja ...

  6. 深入理解JVM(二)Java内存区域

    2.1 C.C++内存管理是由开发人员管理,而Java则交给了JVM进行自动管理 2.2 JVM运行时数据区:方法区.堆(运行时线程共享),虚拟机栈.本地方法栈.程序计数器(运行时线程隔离,私有) 1 ...

  7. 深入理解JVM(一) -- 自动内存管理机制

    Java运行时数据区域分为:程序计数器,虚拟机栈,本地方法栈,Java堆,方法区,运行时常量池,直接内存,结构如下: 1.程序计数器: 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示 ...

  8. 深入理解JVM(四) -- 垃圾内存回收的判定方法和内容

    上一篇文章我们学到了对象在内存中是如何存储的已经是如何被访问的,这篇文章将介绍当内存空间不够时,虚拟机将怎样判定对象可不可以被回收已经哪些地方会发生回收. 垃圾回收主要(不是全部)发生在堆内存中,当一 ...

  9. 理解JVM之java内存模型

    java虚拟机规范中试图定义一种java内存模型(JMM)来屏蔽掉各种硬件和操作系统内存访问差异,以实现让java程序在各种平台都能打到一致的内存访问效果.所以java内存模型的主要目标是定义程序中各 ...

  10. 深入理解JVM(一)--Java 内存区域

    一.  运行时数据区域 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域. Java虚拟机所管理的内存将会包括以下几个运行时数据区域:               ...

随机推荐

  1. Android-apktool-就从此处开始反编译之旅

    前言 一直听说过反编译,感觉很高大上,一直没自己用过,今天因缘巧合之下,终于要开始逐渐认识,了解和学习一下反编译了~先给自己说下加油,鼓励一下下 apktool的下载和安装 apktool 下载地址: ...

  2. 绝对和相对误差(absolute & relative error)

    1. 标量 真实值为 x,测量值为 x0, 绝对误差(absolute error):Δx=x0−x(有单位): 相对误差(relative error):δx=Δxx=x0−xx=x0x−1(是一个 ...

  3. Apache Cordova开发环境搭建(二)VS Code

    原文:Apache Cordova开发环境搭建(二)VS Code 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011127019/articl ...

  4. POJ 1328 Radar Installation(经典贪婪)

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 54143   Accepted: 12 ...

  5. 概率分布的 perplexity

    1. 一种 measurement 信息论中,perplexity is a measurement of how well a probability distribution or probabi ...

  6. explanatory variable(independent vs dependent)、design matrix

    design matrix(设计矩阵) 是统计学上的概念,一般标记为 X,是由一组对象的解释变量(explanatory variables)构成的矩阵. 1. explanatory variabl ...

  7. WPF3D绘图的基础

    原文:WPF3D绘图的基础 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/69487096 ...

  8. Binding控件某个属性

    <Grid Margin="60"> <Grid.RowDefinitions> <RowDefinition Height="*" ...

  9. JAVASCRIPT高程笔记-------第十章 DOM对象

    10.1.1 node类型 --除IE外 所有浏览器都可以访问到这个类型 :JS中所有的节点类型都继承自Node类型 nodeName 与nodeValue  如果是一个元素 那么nodeName中保 ...

  10. 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法

    原文:更改开机默认不显示explorer.exe,直接启动自己写的EXE程序方法 更改开机默认不显示explorer.exe,直接启动自己写的EXE程序的函数: bool UpdateWinlogon ...