关于JVM的面试传送门:https://blog.csdn.net/shengmingqijiquan/article/details/77508471

JVM内存结构主要划分为:堆,jvm栈,本地方法栈,方法区,程序计数器

如下图所示:

堆区:

简单概述:每个Java项目都有唯一对应的一个JVM实例,每一个JVM实例又对应着一个堆区。Java堆是被当前应用所有进程所共享的,在JVM启动时就创建了。堆区的目的就是存放所有new创建实例对象和数组,由此可见堆对于当前应用来说是全局的。

  PS:这也就解释了假设有A,B两个Java项目,A项目有a,b,c三个类,a类可以调用b,c三个类,但是在B项目就不可以使用a,b,c三个类了

堆区的特点:堆的主要优势是灵活性,它可以的动态的分配内存。编译器不需要知道需要创建对象的时候需要分配多少内存给它,也不需要知道该对象的生命周期。new一个对象的时候会自动从堆中分配内存给它,然后如果长时间没有引用指向该对象时,JVM垃圾回收机制会在某个合适的时间点回收它。

Java堆是jvm管理内存中最大的一块,它也是JVM垃圾回收的主要区域。虽然JVM垃圾回收机制会在某个合适的时间点自动回收没有引用指向的对象,但是作为java开发人员,掌握垃圾回收机制是很重要的,日后还要去学习这个....

本地方法栈:

虚拟机执行Native方法服务,执行不是用Java代码写的如C写的

虚拟机栈区:

  当程序进入到一个方法时,会为这个方法分配一个私有存储空间,该空间为JVM栈。该线程为私有的。就好比你在a()方法中定义了int t = 1;但是在b方法中就不能直接用t。但是栈里面的数据是可以共享的。当方法结束时,该区域就释放了

  栈的速度比堆要快,仅次于寄存器。但是缺少灵活性,其数据大小和生存周期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了)

  至于为什么函数调用要采用栈调用,主要是契合数据结构中栈的先进后出原则,可以看下这篇连接:https://www.zhihu.com/question/34499262/answer/59415153

  实例分析一:栈里面的数据是共享的

  int a=1;

  int b=1;

  编译器预先处理int a =1;首先在栈中创建一个变量为a的引用,然后去栈中查找有没有字面值为1的地址,没有就开辟一个存放字面值为1的地址。接着执行b=1;创建一个变量为b的引用,由于已经存在字面值为1的地址了,所以b直接指向该地址。所以:出现了a,b同时指向1这个地址

  特别注意:字面值的引用与对象的引用是不一样的,假设两个类对象的引用指向同一个对象,如果一个引用对象修改了这个类的内部状态,那么另一个引用对象也会即可反映出这个变化;而字面值引用则不会,假设在写上b=2,那么b引用会重新去JVM栈中去寻找字面值为2的地址,找不到则重新开辟一个地址来存储2,然后b引用在指向它

public class test2 {

    public static void main(String[] args) {
int a = 1;
int b = 1;
// 1.创建变量为a的引用,在JVM栈中开辟字面值为1的地址,a在指向它
// 2.创建变量为b的引用,栈中已存在字面值为1的地址,b直接指向该地址。所以a,b地址相同
System.out.println(a == b); //true
b = 2;
System.out.println(a==b); //false
} }
public class test {

    int num = 1;

    public static void main(String[] args) {
// 创建变量为a的对象引用,new test()在堆中分配内存存储该对象,a再指向堆区中该对象的地址
test a = new test();
// 创建变量值为b的引用对象,指向a指向的堆区中地址
test b = a;
System.out.println(a == b);
b.num = 2;
//这里就属于另一个对象引用修改了该对象的内部状态,导致a受影响了
System.out.println(a.num); // 2 如果是test b = new test()则输出1,因为指向的不是同一个对象 // 这里又在堆区中给test对象分配了内存
test c = new test();
System.out.println(a == c);
} }

关于包装类型数据:如Integer,Double,Float等将基本数据类型包装起来的类,它们存在于堆区中。Java用new()来显示的告诉编译器要创建。之后将对包装类型做一下整理,尤其是地址指向

http://www.blogjava.net/hgc-ghc/archive/2013/05/02/398675.html

方法区:

  方法区也同堆一样是被所有线程所共享的,它里面存放着satic修饰的代码和类信息,常量(final修饰)

程序计数器:

线程私有,占用内存小。

字节码行号指示器,解释器通过它来选取下一条执行的字节码指令

  • 执行 Java 方法:具体的内容就是指向下一个指令的偏移
  • 执行 Native 方法:计数值为空(undefined)

不会有 OutOfMemoryError

JVM内存结构简单认知的更多相关文章

  1. 这一次,终于系统的学习了 JVM 内存结构

    最近在看< JAVA并发编程实践 >这本书,里面涉及到了 Java 内存模型,通过 Java 内存模型顺理成章的来到的 JVM 内存结构,关于 JVM 内存结构的认知还停留在上大学那会的课 ...

  2. java线程基础巩固---多线程与JVM内存结构的关系及Thread构造函数StackSize的理解

    继续学习一下Thread的构造函数,在上次[http://www.cnblogs.com/webor2006/p/7760422.html]已经对如下构造都已经学习过了: 多线程与JVM内存结构的关系 ...

  3. 简单说说 Java 的 JVM 内存结构

    问:简单说说 Java 的 JVM 内存结构分为哪几个部分? 答:JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分,分别解释如下.虚拟机栈:线程私有的,每个方法在执行时会创建一个 ...

  4. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  5. 【JVM】JVM内存结构 VS Java内存模型 VS Java对象模型

    原文:JVM内存结构 VS Java内存模型 VS Java对象模型 Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清 ...

  6. 【转】JVM内存结构 VS Java内存模型 VS Java对象模型

    JVM内存结构 我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途. 其中有些区域随着虚拟机进程的启动而 ...

  7. java的线程安全、单例模式、JVM内存结构等知识学习和整理

    知其然,不知其所以然 !在技术的海洋里,前路漫漫,我一直在迷失着自我. 欢迎访问我的csdn博客,我们一同成长! "不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!" 博 ...

  8. JVM内存结构 JVM的类加载机制

    JVM内存结构: 1.java虚拟机栈:存放的是对象的引用(指针)和局部变量 2.程序计数器:每个线程都有一个程序计数器,跟踪代码运行到哪个位置了 3.堆:对象.数组 4.方法区:字节流(字节码文件) ...

  9. JVM入门——JVM内存结构

    一.java代码编译执行过程 1.源码编译:通过Java源码编译器将Java代码编译成JVM字节码(.class文件) 2.类加载:通过ClassLoader及其子类来完成JVM的类加载 3.类执行: ...

随机推荐

  1. SQL Server中是否可以准确获取最后一次索引重建的时间?

    在SQL Server中,我们能否找到索引的创建时间?最后一次索引重建(Index Rebuild)的时间? 最后一次索引重组(INDEX REORGANIZE)的时间呢?  答案是我们无法准确的找到 ...

  2. 关于bootstrap报错

    在使用bootstrap报错.报错的位置如下 if("undefined"==typeof jQuery)throw new Error("Bootstrap's Jav ...

  3. 手机web——自适应网页设计(html/css控制)【转】

    一. 允许网页宽度自动调整: "自适应网页设计"到底是怎么做到的?其实并不难. 首先,在网页代码的头部,加入一行viewport元标签. <meta name="v ...

  4. vue 对列表数组删除和增加

    很重要,一定要好好研究 https://cn.vuejs.org/v2/guide/list.html#%E6%9B%BF%E6%8D%A2%E6%95%B0%E7%BB%84

  5. 两篇文章带你走入.NET Core 世界:CentOS+Kestrel+Ngnix 虚拟机先走一遍(一)

    背景: 上一篇:ASP.Net Core on Linux (CentOS7)共享第三方依赖库部署 已经交待了背景,这篇就省下背景了. 折腾的过程分两步: 第一步是:本机跑虚拟机部署试一下: 第二步是 ...

  6. MVC添加Area出现“到多个与名为“Home”的控制器匹配的类型的解决方法”

    新建MVC项目,添加HomeController,然后添加名字为Admin的Area后,新建HomeController.这个时候,运行项目会出现以下错误: 解决办法如下: 打开网址下面的HomeCo ...

  7. 年轻的工程师如何月入伍万XD

    郑昀:你要跟谁比?关键词:成长,自我管理,自我激励,面试,候选人201806 ——你觉得跟你的 Leader 差在什么地方?——肯定有差距,一个是知识面不如他广,二一个是解决问题不如他老练.——怎么追 ...

  8. 安恒杯 3月线上个人赛WriteUp

    #前言 这次做的还挺多的,只有个Web300没做出来,排名由上次60+进步到这次16名(最后三分钟掉了5名),感觉还是不错的.但是很明显,流量题有很大的运气成分.做完流量题之后还剩一个多小时,水了水M ...

  9. qml demo分析(text-字体展示)

    上一篇文章分析了一个小游戏,使用qml编写界面+js进行复杂逻辑控制,算是一个比较完整的qml示例代码了,今天就不那么继续变态啦,来看一个简单的字体示例程序吧,该示例代码比较简单,主要是展示了几个简单 ...

  10. ASCII Art ヾ(≧∇≦*)ゝ

    Conmajia, 2012 Updated on Feb. 18, 2018 What is ASCII art? It's graphic symbols formed by ASCII char ...