首页 文章 精选 留言 我的

精选列表

搜索[流量结构],共10011篇文章
优秀的个人博客,低调大师

JVM内存结构与内存模型

字节码解释器通过改变这个计算器的值来选择下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复,如果执行的是Native方法,这个计算器的值则为空 Java虚拟机栈(线程私有) (1) 是什么 Java虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧,每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。 (2) 组成 ① 局部变量表 存放了编译期可知的基本类型、对象引用类型和returnAddress类型(指向一条字节码指令的地址。即程序就是存储在方法区的字节码指令,而 returnAddress 类型的值就是指向特定指令内存地址的指针) ② 操作数栈 操作数是一个后入先出栈,JVM所有的操作码都是对操作数栈上的数据进行操作,对于每一个方法的调用,JVM会建立一个操作数栈,以供计算使用。 例如 a = b + c 的字节码执行过程中操作数栈以及局部变量表的变化如下图所示。 局部变量表中存储着a、b、c 三个局部变量,首先将b和c分别入栈 ③ 动态链接 运行期间转化为直接引用,就称为动态链接。Class字节码的常量持中存有大量的符号引用,在运行期才将符号引用变成直接引用(也就是指向数据),可以是方法或者字段的引用。 ④ 方法出口 即本方法执行后下一步指令的地址,方法正常退出时,调用者PC计数器的值就可以作为返回地址,异常退出时,返回地址是要通过异常处理器来确定。 本地方法栈(线程私有) (1) 是什么? 保存native方法进入区域的地址 Java堆(线程共享) (1) 是什么? 所有的对象实例以及数组都要在堆上分配。是垃圾收集器管理的主要区域。 (2) 分区 ① 新生代: Eden区、Survivor From区、Survivor To区 ② 老年代 方法区(线程共享) (1) 是什么 方法区用于存储已被虚拟机加载的类信息、方法、常量、静态成员变量、JIT(即时编译器)编译后的代码等数据,在类加载时分配。 (2) 也叫非堆,分配在元空间 元空间:类的元数据,如方法数据、方法信息(字节码,栈和变量大小)、运行时常量池、已确定的符号引用和虚方法表等方法区的数据,保存在本地内存区域(堆外内存) 运行时常量池(线程共享) (1) 是什么 运行时常量池用于存放编译期和运行期生成的各种字面量和符号引用。这部分内容将在类加载后进入方法区的运行时常量池中存放。属于方法区的一部分 (2) 字面量和符号引用 字面量:1.字符串;2.基本类型值;3.final常量 符号引用:1.类和方法的全限定名;2.字段的名称和描述符;3.方法的名称 二、 Jvm内存模型 定义 由于不同平台内存模型的差异,有可能导致程序在不同平台的并发访问出错。Java内存模型(Java Memory Model,JMM)是屏蔽各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。 具体操作 定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量的底层细节。 此处的变量是指实例字段,静态字段和构成数组对象的元素,不包括局部变量与方法参数 主内存和工作内存 Jvm内存模型规定所有的变量都存储在主内存中,每条线程还有自己的工作内存,工作内存保存了被该线程使用到的变量的主内存副本拷贝。 synchronization、final、volatile (1) synchronization ① 互斥 对于一个monitor对象,当被一个线程持有,其他线程只能等待 ② 可见性 保证了线程在同步代码块期间写入动作,对于后续进入该代码块的线程是可见的(持有相同monitor对象的线程)。 当前线程释放monitor对象,作用是把cpu缓存数据刷新到主内存中;其他线程进入该代码块时,需要获取monitor对象,会使cpu缓存失效,从而使变量从主内存中重新加载。 需要java学习路线图的私信笔者“java”领取哦!另外喜欢这篇文章的可以给笔者点个赞,关注一下,每天都会分享Java相关文章!还有不定时的福利赠送,包括整理的学习资料,面试题,源码等~~

优秀的个人博客,低调大师

python 数据结构 元组 tuple

tuple使用场景 Tuple 比 list 操作速度快。如果您定义了一个值的常量集,并且唯一要用它做的是不断地遍历它,请使用 tuple 代替 list。 如果对不需要修改的数据进行 “写保护”,可以使代码更安全。使用 tuple 而不是 list 如同拥有一个隐含的 assert 语句,说明这一数据是常量。如果必须要改变这些值,则需要执行 tuple 到 list 的转换 (需要使用一个特殊的函数)。 Tuples 可以在 dictionary 中被用做 key,但是 list 不行。实际上,事情要比这更复杂。Dictionary key 必须是不可变的。Tuple 本身是不可改变的,但是如果您有一个 list 的 tuple,那就认为是可变的了,用做 dictionary key 就是不安全的。只有字符串、整数或其它对 dictionary 安全的 tuple 才可以用作 dictionary key。 Tuples 可以用在字符串格式化中,后面会用到。 字符串 >>>#变量引用str >>> s = "abc" >>> s 'abc' 元组 >>>#如果这样写,就会是... >>> t = 123,'abc',["come","here"] >>> t (123, 'abc', ['come', 'here']) 上面例子中看到的变量t,并没有报错,也没有“最后一个有效”,而是将对象做为一个新的数据类型:tuple(元组),赋值给了变量t。 元组是用圆括号括起来的,其中的元素之间用逗号隔开。(都是英文半角) tuple是一种序列类型的数据,这点上跟list/str类似。它的特点就是其中的元素不能更改,这点上跟list不同,倒是跟str类似;它的元素又可以是任何类型的数据,这点上跟list相同,但不同于str。 >>> t = 1,"23",[123,"abc"],("python","learn") #元素多样性,近list >>> t (1, '23', [123, 'abc'], ('python', 'learn')) >>> t[0] = 8 #不能原地修改,近str Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> t.append("no") Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'append' >>> 从上面的简单比较似乎可以认为,tuple就是一个融合了部分list和部分str属性的杂交产物。此言有理。 像list那样访问元素和切片 先复习list中的一点知识: >>> one_list = ["python","hiekay","github","io"] >>> one_list[2] 'github' >>> one_list[1:] ['hiekay', 'github', 'io'] >>> for word in one_list: ... print word ... python hiekay github io >>> len(one_list) 4 上面的list如果换成tuple是否可行 >>> t (1, '23', [123, 'abc'], ('python', 'learn')) >>> t[2] [123, 'abc'] >>> t[1:] ('23', [123, 'abc'], ('python', 'learn')) >>> for every in t: ... print every ... 1 23 [123, 'abc'] ('python', 'learn') >>> len(t) 4 >>> t[2][0] #还能这样呀,哦对了,list中也能这样 123 >>> t[3][1] 'learn' 所有在list中可以修改list的方法,在tuple中,都失效。 分别用list()和tuple()能够实现两者的转化: >>> t (1, '23', [123, 'abc'], ('python', 'learn')) >>> tls = list(t) #tuple-->list >>> tls [1, '23', [123, 'abc'], ('python', 'learn')] >>> t_tuple = tuple(tls) #list-->tuple >>> t_tuple (1, '23', [123, 'abc'], ('python', 'learn')) ``` XX

优秀的个人博客,低调大师

python 数据结构 list(3)

list解析 先看下面的例子,这个例子是想得到1到9的每个整数的平方,并且将结果放在list中打印出来 >>> power2 = [] >>> for i in range(1,10): ... power2.append(i*i) ... >>> power2 [1, 4, 9, 16, 25, 36, 49, 64, 81] python有一个非常有意思的功能,就是list解析,就是这样的: >>> squares = [x**2 for x in range(1,10)] >>> squares [1, 4, 9, 16, 25, 36, 49, 64, 81] 找出100以内的能够被3整除的正整数。 我们用的方法是: aliquot = [] for n in range(1,100): if n%3 == 0: aliquot.append(n) print aliquot 用list解析重写,会是这样的: >>> aliquot = [n for n in range(1,100) if n%3==0] >>> aliquot [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99] 另一个: >>> print range(3,100,3) [3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99] 其实,不仅仅对数字组成的list,所有的都可以如此操作。 >>> mybag = [' glass',' apple','green leaf '] #有的前面有空格,有的后面有空格 >>> [one.strip() for one in mybag] #去掉元素前后的空格 ['glass', 'apple', 'green leaf'] enumerate 这是一个有意思的内置函数,本来我们可以通过for i in range(len(list))的方式得到一个list的每个元素编号,然后在用list[i]的方式得到该元素。如果要同时得到元素编号和元素怎么办?就是这样了: >>> for i in range(len(week)): ... print week[i]+' is '+str(i) #注意,i是int类型,如果和前面的用+连接,必须是str类型 ... monday is 0 sunday is 1 friday is 2 python中提供了一个内置函数enumerate,能够实现类似的功能 >>> for (i,day) in enumerate(week): ... print day+' is '+str(i) ... monday is 0 sunday is 1 friday is 2 实验: >>> seasons = ['Spring', 'Summer', 'Fall', 'Winter'] >>> list(enumerate(seasons)) [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] >>> list(enumerate(seasons, start=1)) [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')] 在这里有类似(0,'Spring')这样的东西,这是另外一种数据类型,待后面详解。 下面将enumerate函数和list解析联合起来,同时显示,在进行list解析的时候,也可以包含进函数 >>> def treatment(pos, element): ... return "%d: %s"%(pos,element) ... >>> seq = ["hiekay","hiekay.github.io","python"] >>> [ treatment(i, ele) for i,ele in enumerate(seq) ] ['0: hiekay', '1: hiekay.github.io', '2: python'] 函数lambda: 例如: g = lambda x:x+1 ambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数,x+1为函数体,用函数来表示为: def g(x): return x+1 >>> seq = ["hiekay","hiekay.github.io","python"] >>> foo = lambda i,ele:"%d:%s"%(i,ele) #lambda函数,给代码带来了简介 >>> [foo(i,ele) for i,ele in enumerate(seq)] ['0:hiekay', '1:hiekay.github.io', '2:python']

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册