读 - 深入理解java虚拟机 - 笔记(一) - java内存区域模型(2章)

使用java也有好几年了,记得大学时是在听老师讲,觉得好像没多少东西啊,工作第一年并没有找到java岗位,而是做cobol去了,估计知道cobol的人少之又少吧。的确,这个语言真是太古老了,而且做这个最痛苦的是,很多资料都是企业内部资料,外面能找到的寥寥无几。

干了一年,更多的时候都是在发邮件,扯皮,解决bug。银行的系统追求的是稳定而不是创新,做的很憋屈,又想重新回到java岗位上,但是简历投了不少,苦于之前并没有java项目经验,哎,只能说毕业时决策失误,不过好在基础不错,到是有几家给了offer,选择了一家自研公司,进去了。

得益于基础知识不错,ssm框架和mvc思想还过得去,上手很快。代码写出来问题也不多,评审时也过得去。也算成功入门了,入门之后很长时间都是熟悉业务,研究系统,没有过多的时间抽身出来读书,大概快一年的时候,对于手头工作能很好的处理,问题也能很容易解决了,此时终于有时间可以自己去读一读书了,本人其实读书不是很有耐心,但是读过几次,写点博客,发现还是很有动力的。

前面的jdk源码还是会继续读下去的,最近也刚入手了并发编程的书,准备结合源码去读一读,顺带一起的还是购入了虚拟机,关于虚拟机之前在碰到静态变量时其实已经去了解了不少,但是并没有记录心得。


分割线----------------------------------------------------------------------------------------------

废话太多。

对于平时编写java代码来说,内存的申请,使用都不是我们关心的事,作为小码农来说,就是new,new,new,所以今天就来看看jvm是如何来管理内存的。网络盗图一张,这图很常见,多的很,自己也就不画了。

看最外面是叫运行时数据区,我们知道java是要编译之后才能运行的。那么首先java编译期会将.java文件编译成.class文件,然后jvm中的类加载器会去加载类的字节码,加载完毕之后呢,会交给jvm执行引擎。对于怎么加载的,怎么编译的,不在第一张讨论啊,以后会看到的,到时候再说。引擎执行时肯定会有一个空间来保存这些数据和相关信息,这个空间就是运行时数据区了,Run Time Data Area嘛,因此,可以说平时所谓的内存管理就是针对这段空间进行管理的。

通常很多人都会笼统的说,虚拟机内存分为栈区,堆区,这是很粗略的分,像我们java从业者肯定不能满足于此啊。

上图可以看见,堆区和方法区是线程共享的,这也是多线程需要注意的,为什么new出来的对象,你修改之后,其他线程会读取到脏数据,因为在虚拟机中它是共享区域,像所谓的栈区,也就是虚拟机栈,本地方法栈,程序计数器都是线程独有的,每一个线程都存储自己独有的数据,不难理解,在方法内部新建的临时变量为什么不会出现并发问题,像前面读取的CAS的操作时,为什么内部会出现一个临时变量,因为它是这个线程独有的,其他线程看不见。

一.程序计数器.

程序计数器是指CPU中的寄存器,保存的是当前执行的指令的地址(也可以认为保存的是下一条指令所在存储单元的地址)。当CPU需要执行指令时,需要从程序计数器中读取当前需要执行的指令所在的存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器变自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至完成所有指令。

jvm中的寄存器并非物理概念上的CPU寄存器,但是功能在逻辑上是等同的,也是用来指示应该执行那条指令的。可以看做是当前线程所执行的字节码的行号指示器,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖它。

可以想象一下,它的工作是需要知道程序下一条指令应该运行什么。那么就意味着每个线程都应该有自己的程序计数器,这就是为什么程序计数器是程序私有的。事实上,jvm中多线程运行时是通过轮流切换来获得程序执行时间的,因此,在某个具体的时刻,一个CPU只会执行一条线程中的指令,那么此时问题就会出现,在线程切换后CPU是如何知道从线程1切换到线程2之后,执行线程2中哪一条指令呢?所以对于每个线程都记录了自己的程序计数器。

jvm规范中还有一个规定,如果线程执行的是一个java方法,那么记录的是当前正在执行的字节码指令地址,如果执行的是Native方法,这个计数器就为Undefined。

对于上面为什么记录是Undefined,我也不知道是为什么,可以参考下面回答。

https://www.zhihu.com/question/40598119

需要注意的最后一点,在程序计数器这一块内存中,是没有OOM问题的,这个应该在规范中有所体现,他能存放下java方法的字节码地址值。


二.java虚拟机栈

与程序计数器一样,虚拟机栈也是程序私有的,它的生命周期与线程一致,线程结束它就结束了。每个方法在执行时都会创建一个栈帧,存放如局部变量,操作数栈,动态链接,方法出口等信息,每个方法从调用开始到执行结束,就对应着栈帧从入栈到出栈的过程。

局部变量表:存放的是局部变量(包括方法定义的非静态变量以及形参),这些局部变量就是基本类型变量,是直接存储变量的值,而对于引用变量来说,存储的是指向对象的引用值。这些变量在编译期就能确定大小,因此程序执行期间局部变量表的大小是不会改变的。

操作数栈:程序中所有计算过程都是借助操作数栈来完成的。操作数栈是一个LIFO栈(Last-In-First-Out),栈帧中操作数栈的长度由编译期决定。栈帧刚刚创建时,操作数栈是空的。java虚拟机提供字节码从局部变量表或者对象实例的字段中复制常量或者变量值到操作数栈中。当然也有指令取出这些数据。因此虚拟机把操作数栈作为工作区。

begin
iload_0 // push the int in local variable 0 onto the stack
iload_1 // push the int in local variable 1 onto the stack
iadd // pop two ints, add them, push result
istore_2 // pop int, store into local variable 2
end

在这个字节码序列里,前两个指令iload_0和iload_1将存储在局部变量中索引为0和1的整数压入操作数栈中,其后iadd指令从操作数栈中弹出那两个整数相加,再将结果压入操作数栈。第四条指令istore_2则从操作数栈中弹出结果,并把它存储到局部变量区索引为2的位置。图5-10详细表述了这个过程中局部变量和操作数栈的状态变化,图中没
有使用的局部变量区和操作数栈区域以空白表示。


动态链接:这个链接是指向运行时常量池的引用,这些链接的作用就是将这些符号引用所表示的方法转换为实际方法的直接引用。符号引用和直接引用是类加载里的知识点,在这边不做阐述,后续里会有。

方法出口:当一个方法执行完之后就要返回调用它的地方,这边就是保存一个方法返回地址。

虚拟机规范中,对这个区域定义两个异常情况,SOF 和OOM ,SOF异常是当线程请求的栈深度大于虚拟机所允许的栈深度时,抛出SOF异常,这是基于虚拟机栈被实现为固定大小内存时出现的。如果虚拟机被实现为动态扩展内存大小时,如果扩展时无法申请到足够大的内存时,会抛出OOM异常。

三.本地方法栈

本地方法栈和虚拟机栈原理类似,虚拟机栈是执行的java方法,而本地方法栈执行的是Native方法。因此也会有SOF和OOM异常出现。

四.堆

堆是虚拟机中内存占用最大的一块,堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,虚拟机规范中指出,所有的对象实例和数组都需要在堆上分配。堆是垃圾回收器管理的主要区域,很多时候被称为GC堆,它可以物理上不连续,只要逻辑上连续即可,可通过-Xmx和-Xms控制。如果堆中没有内存完成实例分配,就会出现OOM异常。

五.方法区

方法区与堆一样,被各个线程共享,用于存储虚拟机加载的类信息,常量,静态变量,及编译器编译后的代码等数据,虽然虚拟机规范将方法区描述为堆的一个逻辑部分,但是它确有个别名,非堆。

六.运行时常量池

运行时常量池是方法区的一部分,用于存放编译器生成的各种字面量和符号引用。它是具有动态性,java语言并非要求常量一定只有编译期才能产生,运行时也能将新的常量放入,如String.intern()方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。
基于GPT-SoVITS的视频剪辑快捷配音工具 GPT, 通常指的是“Generative Pre-trained Transformer”(生成式预训练转换器),是一个在自然语言处理(NLP)领域非常流行的深度学习模型架构。GPT模型由OpenAI公司开发,并在多个NLP任务上取得了显著的性能提升。 GPT模型的核心是一个多层Transformer解码器结构,它通过在海量的文本数据上进行预训练来学习语言的规律。这种预训练方式使得GPT模型能够捕捉到丰富的上下文信息,并生成流畅、自然的文本。 GPT模型的训练过程可以分为两个阶段: 预训练阶段:在这个阶段,模型会接触到大量的文本数据,并通过无监督学习的方式学习语言的结构和规律。具体来说,模型会尝试预测文本序列中的下一个词或短语,从而学习到语言的语法、语义和上下文信息。 微调阶段(也称为下游任务训练):在预训练完成后,模型会被应用到具体的NLP任务中,如文本分类、机器翻译、问答系统等。在这个阶段,模型会使用有标签的数据进行微调,以适应特定任务的需求。通过微调,模型能够学习到与任务相关的特定知识,并进一步提高在该任务上的性能。 GPT模型的优势在于其强大的生成能力和对上下文信息的捕捉能力。这使得GPT模型在自然语言生成、文本摘要、对话系统等领域具有广泛的应用前景。同时,GPT模型也面临一些挑战,如计算资源消耗大、训练时间长等问题。为了解决这些问题,研究人员不断提出新的优化方法和扩展模型架构,如GPT-2、GPT-3等,以进一步提高模型的性能和效率。
GPT, 通常指的是“Generative Pre-trained Transformer”(生成式预训练转换器),是一个在自然语言处理(NLP)领域非常流行的深度学习模型架构。GPT模型由OpenAI公司开发,并在多个NLP任务上取得了显著的性能提升。 GPT模型的核心是一个多层Transformer解码器结构,它通过在海量的文本数据上进行预训练来学习语言的规律。这种预训练方式使得GPT模型能够捕捉到丰富的上下文信息,并生成流畅、自然的文本。 GPT模型的训练过程可以分为两个阶段: 预训练阶段:在这个阶段,模型会接触到大量的文本数据,并通过无监督学习的方式学习语言的结构和规律。具体来说,模型会尝试预测文本序列中的下一个词或短语,从而学习到语言的语法、语义和上下文信息。 微调阶段(也称为下游任务训练):在预训练完成后,模型会被应用到具体的NLP任务中,如文本分类、机器翻译、问答系统等。在这个阶段,模型会使用有标签的数据进行微调,以适应特定任务的需求。通过微调,模型能够学习到与任务相关的特定知识,并进一步提高在该任务上的性能。 GPT模型的优势在于其强大的生成能力和对上下文信息的捕捉能力。这使得GPT模型在自然语言生成、文本摘要、对话系统等领域具有广泛的应用前景。同时,GPT模型也面临一些挑战,如计算资源消耗大、训练时间长等问题。为了解决这些问题,研究人员不断提出新的优化方法和扩展模型架构,如GPT-2、GPT-3等,以进一步提高模型的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值