案例代码如下: public class JVMTest { public static Integer num = 10; public int add(int i){ int j = 5; int k = i+j; j++; k = num + j; return k; } public static void main(String[] args){ System.out.println(new JVMTest().add(4)); } } 编译之后主要指令集如下: { public st…
本文转载自:从 i++ 和 ++i 说起局部变量表和操作数栈 最近公司有人看了尚硅谷柴林燕老师的第一季面试题,就想来考考我.我觉得柴老师讲的很好,部分内容可以延伸一下,所以写这篇文章分享给大家! 这篇文章涉及到了一点 JVM 方面的知识.面试时可能也会遇到,所以认真看不会吃亏! int i = 1; i = i++; int j = i++; int k = i + ++i * i++; // 业余草:www.xttblog.com System.out.println("i = "…
目录 前置知识 引子 基于寄存器的设计模式 基于栈的设计模式 一个简单的例子 如何查看局部变量表? 实例方法中的局部变量表 结论 前置知识 阅读本文需要对以下知识有所了解: * 栈 * 汇编 * Java 基础 * 逆波兰表达式(有学过的同学阅读本文毫无障碍) 引子 基于寄存器的设计模式 就我们所熟知的x86或arm指令集来说,其对数据的操作都是基于寄存器.例如,要对两个数执行加法操作则需要将这两个数分别送入两个寄存器再执行加法操作,这也符合我们对于编程语言认知,更加易于理解. 基于栈的设计模式…
Java程序员一般不需要太关注内存,因为操作内存的权力都交给了Java虚拟机,但是Java程序员必须需要了解JVM是如何使用内存的,否则一旦内存出现泄漏或事溢出的话,就会一筹莫展不知道从哪去入手排查问题. 一.JVM内存模型 JVM在运行时会把它管理的内存划分成若干个不同区域,每个区域有各自不同的用处,以及不同的创建和销毁的时间,有的随着JVM进程启动而存在,而有的需要随着用户线程的启动和结束而创建和销毁,主要内存区域划分如下图示: 主要分成两大类,线程共享的区域和线程独享的区域. 线程共享区域…
Java内存区域 线程私有数据区域:虚拟机栈,本地方法栈,程序计数器 线程共享数据区域:方法区,堆 程序计数器:当前线程所执行的字节码的行号指示器,JVM通过这个字节码解释器改变计数器的值,以选择下一条需要执行的字节指令码.分支,循环,跳转,异常处理,线程恢复等操作都依赖顺序计数器来完成(JVM执行指令的逻辑控制器). 虚拟机栈:虚拟机栈是线程独立的,也就是说每个线程有自己私有的虚拟机栈,它的生命周期是与线程同步.虚拟机栈是Java方法执行的内存模型, 线程的每个方法在执行的同时都会创建一个栈帧…
一 .前言 JVM是什么,我想诸位肯定都清楚. 好吧,我还是简答说一下JVM即Java虚拟机(够简单吧 233333). 虽然说,所有抛开操作系统,讲虚拟机的内容,都是耍流氓.但是,贫僧不修善果,就爱杀人放火,就爱耍流氓.好吧,扯远了. 言归正传,JVM这是第三遍重温了.第一遍读时,还是在飞机上读的,就记得飞机上的阳光很刺眼,肚子很难受,从书中汲取的知识很少.第二遍读时,是在做地铁时看完的.地铁很挤,书很好看.如今,距离上次读完,已有一载有余,一年发生了很多事,朋友离开,公司散伙,亲人重病.期间…
本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 概述 Java 虚拟机为程序员分担了很多内存管理的工作,不再像 C/C++ 那样容易出现内存泄漏和内存溢出问题了,也正是这样,导致一旦出现了内存泄漏和溢出方面的问题,就难以排查.因此一个优秀的 Java 程序员应该对 Java 虚拟机有充足的了解,JVM 是你的必修课. 运行时数据区域 根据<Java虚拟机规范(Java SE 7版)>,JVM 所管理的内存区域的划分如下: 每个内…
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.csdn.net/qq_35925558/NOTE_JVM https://github.com/uxiahnan/NOTE_JVM 目录 4. 虚拟机栈 4.1. 虚拟机栈概述 4.1.1. 虚拟机栈出现的背景 4.1.2. 初步印象 4.1.3. 内存中的栈与堆 4.1.4. 虚拟机栈基本内容 Ja…
Java虚拟机的内存管理主要分两点:内存分配以及内存回收.· 一.内存分配图: 注: 所占区域的大小与实际的内存大小比例并无直接关系. 解读: 1.如图,分成两种颜色的内存区域,其中蓝色的是线程隔离的数据区,也就是说每一个线程都有自己的这么一个区域存放自己的数据,而青色区域则是线程共享的,里面的数据为所有线程共有,原则上都有权限访问. 2.程序计数器: 用途:用来给程序导航指路的.这个是一块较小的内存空间,可以看做是当前线程执行的字节码的行号指示器.理解就是虚拟机把java源代码编译成了字节码,…
一.概述 执行引擎是虚拟机中最核心的部分之一, 虚拟机自己实现引擎,自己定义指令集和执行引擎的结构体系. 二.栈帧 栈帧包含(1)局部变量表.(2)操作数栈.(3)动态链接.(4)方法返回地址.(5)额外的附加信息 栈顶的栈帧为当前栈帧,是唯一有效的. 2.1 局部变量表 用于存放方法参数和方法内部定义的局部变量.单位为槽(Slot),每个槽可以存放一个变量(Boolean,byte,char,short,int,float,reference,returnAddress),lonng,doub…