局部变量

Java虚拟机之栈帧

给你一囗甜甜゛ 提交于 2020-02-08 15:27:13
简述 栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机运行时数据区中的虚拟机栈的栈元素。 栈帧存储了方法的 局部变量表 、 操作数栈 、 动态链接 和 方法返回地址 等信息。 总的来看,其结构大概如下图黄色区域那样。 在单个线程中,每一个调用方法jvm都会为其分配一个栈帧。上图中,main方法中包含一个栈帧,然后在main方法里面调用了computer()方法,然后这个computer()方法也会含有自己的栈帧。另外每个栈帧内部都含有自己的局部变量表、操作数栈、动态链接、方法返回地址等信息。 局部变量表 局部变量表是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在Java程序编译为Class文件时,就在方法表的Code属性的max_locals数据项中确定了该方法需要分配的最大局部变量表的容量。在方法执行时,虚拟机是使用局部变量表完成参数变量列表的传递过程,如果是实例方法,那么局部变量表中的每0位索引的Slot默认是用于传递方法所属对象实例的引用,在方法中可以通过关键字“this”来访问这个隐含的参数,其余参数则按照参数列表的顺序来排列,占用从1开始的局部变量Slot,参数表分配完毕后,再根据方法体内部定义的变量顺序和作用域来分配其余的Slot。局部变量表中的Slot是可重用的,方法体中定义的变量

Java虚拟机系列一:一文搞懂 JVM 架构和运行时数据区

…衆ロ難τιáo~ 提交于 2020-02-08 12:56:18
前言 之前写博客一直比较随性,主题也很随意,就是想到什么写什么,对什么感兴趣就写什么。虽然写起来无拘无束,自在随意,但也带来了一些问题,每次写完一篇后就要去纠结下一篇到底写什么,看来选择太多也不是好事儿,更重要的是不成体系的内容对读者也不够友好。所以以后的博客尽量按系列来写,不过偶尔也会穿插其他的内容。接下来一段时间我会把写博客的重点放在 JVM (Java Virtual Machine) 和 JUC (java util concurrent ) 上,对 Java 虚拟机和 Java 并发编程进行一系列的介绍,欢迎关注。 了解 JVM 是对 Java 开发人员的基本要求,JVM 的相关内容自然也成了现在 Java 程序员面试的重要考点。不过估计很多小伙伴和我一样,长时间醉心于 CRUD,却忘了去了解一下更底层、更基础的东西,殊不知这些才是决定你能在这条路上走多远的关键因素,那接下来我们就一起来深入学习一下看似神秘的 JVM 吧。JVM 总体来看内容还是很多的,我会把最重要的内容介绍给大家,不过如果你有时间和精力的话,还是推荐你去看一下《深入理解Java虚拟机》这本书,确实是有口皆碑。本系列文章也会引用很多此书的内容并加上我自己的理解,如果你坚持看下去的话,相信会有很大的收获。 首先对 JVM 做个简单的介绍,JVM 是 JDK 的一部分,《Java 虚拟机规范》(The

并发编程(四)—— ThreadLocal源码分析及内存泄露预防

眉间皱痕 提交于 2020-02-07 09:49:50
今天我们一起探讨下ThreadLocal的实现原理和源码分析。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。相信本文一定能让大家完全了解ThreadLocal。 ThreadLocal是什么?   ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。那么ThreadLocal到底是什么呢?   ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的 局部变量 ,也许把它命名为ThreadLocalVariable更容易让人理解一些。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。   通过ThreadLocal存取的数据,总是与当前线程相关,也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间

2020-02-06

浪子不回头ぞ 提交于 2020-02-07 01:42:58
Java的变量 1:什么是成员变量和局部变量 成员变量:类中方法外的变量(堆内存) 局部变量:方法中的变量(栈内存) 成员变量:有默认的初始化值 局部变量:没有默认的初始化值,必须先定义,给值后才能使用。 来源: CSDN 作者: 桃红 闹 链接: https://blog.csdn.net/qq_46189247/article/details/104200782

c语言 局部变量做返回值 问题

倖福魔咒の 提交于 2020-02-07 01:10:19
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说, 函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。 下面以函数返回局部变量的指针举几个典型的例子来说明: 1: [cpp] view plain copy #include <stdio.h> char *returnStr() { char *p= "hello world!" ; return p; } int main() { char *str; str=returnStr(); printf( "%s\n" , str); return 0; } 这个没有任何问题,因为"hello world!"是一个字符串常量,存放在 只读数据段 ,把该字符串常量存放的 只读数据段 的首地址赋值给了指针,所以returnStr函数退出时,该该字符串常量所在内存不会被回收,故能够通过指针顺利无误的访问。 2: [html] view plain copy #include < stdio.h >

函数返回局部变量的几种情况

。_饼干妹妹 提交于 2020-02-07 01:04:33
转载 http://blog.csdn.net/haiwil/article/details/6691854/ 本文主要详细讨论了返回返回局部变量的几种情况,值得大家注意。 一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。 下面以函数返回局部变量的指针举几个典型的例子来说明: 1: [cpp] view plain copy #include <stdio.h> char *returnStr() { char *p= "hello world!"; return p; } int main() { char *str; str=returnStr(); printf( "%s\n", str); return 0; } 这个没有任何问题,因为"hello world!"是一个字符串常量,存放在只读数据段,把该字符串常量存放的只读数据段的首地址赋值给了指针,所以returnStr函数退出时

黑幕背后的__block修饰符

久未见 提交于 2020-02-05 22:44:55
我们知道在Block使用中,Block内部能够读取外部局部变量的值。但我们需要改变这个变量的值时,我们需要给它附加上__block修饰符。 __block另外一个比较多的使用场景是,为了避免某些情况下Block循环引用的问题,我们也可以给相应对象加上__block 修饰符。 为什么不使用__block就不能在Block内部修改外部的局部变量? 我们把以下代码通过 clang -rewrite-objc 源代码文件名重写: 1 int main(int argc, const char * argv[]) { 2 @autoreleasepool { 3 int val = 10; 4 void (^block)(void) = ^{ 5 NSLog(@"%d", val); 6 }; 7 block(); 8 } 9 return 0; 10 } 得到如下代码: 1 struct __main_block_impl_0 { 2 struct __block_impl impl; 3 struct __main_block_desc_0* Desc; 4 int val; 5 __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _val, int flags=0) : val(_val) { 6

工具类无法自动注入bean

喜欢而已 提交于 2020-02-05 22:40:11
@Component //把普通pojo实例化到spring容器中 0 public class MyUtil{ // 这里是需要注入的Service @Autowired private MyService myService; private static MyUtil myUtil; /** * 没有这个方法会报空指针,因为还没注入完成就被注册到speing容器中了 ,所以这里用一个局部变量保存注入内容,直接使用局部变量 * * 执行顺序: construct>>PostConstruct>>static 所以在static中使用的对象都是在PostConstruct里提前组装好的 */ @PostConstruct public void init() { myUtil = this; myUtil.myService = this.myService; } public static void insertParam(int id){ // 调用方法 myUtil.myService.testInsert("xxx"); } } 来源: https://www.cnblogs.com/qifengle1412/p/12266809.html

《转》__block修饰符

烂漫一生 提交于 2020-02-05 22:05:09
我们知道在Block使用中,Block内部能够读取外部局部变量的值。但我们需要改变这个变量的值时,我们需要给它附加上 __block 修饰符。 __block 另外一个比较多的使用场景是,为了避免某些情况下Block循环引用的问题,我们也可以给相应对象加上 __block 修饰符。 为什么不使用__block就不能在Block内部修改外部的局部变量? 我们把以下代码通过 clang -rewrite-objc 源代码文件名 重写: int main(int argc, const char * argv[]) { @autoreleasepool { int val = 10; void (^block)(void) = ^{ NSLog(@"%d", val); }; block(); } return 0; } 得到如下代码: struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0* Desc; int val; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _val, int flags=0) : val(_val) { impl.isa = &

Python随手笔记(四)

我们两清 提交于 2020-02-05 17:03:38
Python提供了一些内建函数,同时也支持自己定义的函数,每个函数就像一个程序里的小程序 4.1def语句和参数 def语句中可以加入一些参数放到括号之中,有个小例子: def hello ( a ) : print ( 'Hello, ' + a ) hello ( '吕世龙' ) 如果调用 len()函数,并向它传入像’Hello’这样的参数,函数调用就求值为整数 5。这是传入的字符串的长度。一般来说,函数调用求值的结果,称为函数的返回值。return 语句包含以下部分: return 关键字 函数应该返回的值或表达式 如果使用不带值的 return 语句(也就是只有 return 关键字本身),那么就返回 None。 4.2关键字参数和 print() 大多数参数是由它们在函数调用中的位置来识别的。例如,random.randint(1, 10) 与 random.randint(10, 1)不同。函数调用 random.randint(1, 10)将返回 1 到 10 之间的一个随机整数,因为第一个参数是范围的下界,第二个参数是范围的上界(而random.randint(10, 1)会导致错误)。 但还有一类关键字参数,是由函数调用时加在它们前面的关键字来识别的,例如,print()函数有可选的变元 end 和 sep,分别指定在参数末尾打印什么