【JVM快速入门篇】

news2024/12/28 21:21:09

本笔记内容为狂神说JVM快速入门篇部分

目录

一、JVM的位置 

二、JVM体系结构

三、类加载器(ClassLoader)

四、双亲委派机制

双亲委派机制的作用

五、沙箱安全机制

六、Native

​编辑Native Method Stack 本机方法栈

Native Ilnterface本地接口

七、PC寄存器

八、方法区Method Area

九、栈(stack)

十、三种JVM

十一、堆(Heap)

1、新生区、老年区

2、永久区 

十二、堆内调优 

十三、GC垃圾回收机制

GC常见面试题目 

算法 

1.引用计数法

2.复制算法

3.标记清除法

4.标记压缩法

总结 

十四、JMM 


面试:

请你谈谈你对JVM的理解? java8虚拟机和之前的变化更新?

什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?

JVM的常用调优参数有哪些?

内存快照如何抓取,怎么分析Dump文件?

谈谈JVM中,类加载器你的认识?

1. JVM的位置

2. JVM的体系结构

3.类加载器

4.双亲委派机制

5.沙箱安全机制(了解)

6. Native(重点)

7. PC寄存器(了解)

8.方法区

9.栈

10.三种JVM

11.堆

12.新生区、老年区

13.永久区

14.堆内存调优

15. GC

        1.常用算法

16. JMM

17.总结

一、JVM的位置 


操作系统之上,java程序之下

是JRE的一部分,一个虚构出来的计算机 

二、JVM体系结构


Java虚拟机(JVM)是Java程序的运行环境,它负责将Java源代码编译成字节码文件,并在运行时将字节码文件解释成机器码并执行。 

JVM的体系结构主要由以下三部分组成:

1.类加载器(Class Loader):负责将字节码文件加载到JVM中。类加载器按照特定的顺序加载class文件,首先加载程序的入口类,然后递归加载该类所依赖的其他类。

2.运行时数据区(Runtime Data Area):JVM在运行时会为每个线程创建一个运行时数据区,用于存储线程的状态信息和变量值等。运行时数据区主要包括方法区、堆、虚拟机栈、本地方法栈和程序计数器等。

3.执行引擎(Execution Engine):JVM的执行引擎负责将字节码文件解释成机器码并执行。执行引擎有两种实现方式:解释执行和即时编译。解释执行是将字节码文件逐条解释成机器码并执行,而即时编译是将字节码文件编译成本地机器码,然后执行本地机器码。

总之,JVM的体系结构主要由类加载器、运行时数据区和执行引擎三部分组成。这些组件共同协作,使得Java程序能够在不同的平台上运行,并且具有良好的可移植性和安全性。 

三、类加载器(ClassLoader)


加载class文件 

JVM提供了三层类加载器,分别是:

1. 启动类加载器(Bootstrap ClassLoader):它是JVM内置的类加载器,负责加载Java的核心库,如rt.jar、resources.jar等,它是整个类加载器层次结构的根加载器,它不是Java类,因此无法在Java代码中直接获取到该类加载器。

2. 扩展类加载器(Extension ClassLoader):它负责加载Java的扩展库,默认加载JAVA_HOME/jre/lib/ext目录下的jar包或者-Djava.ext.dirs指定的目录中的jar包。

3. 应用程序类加载器(Application ClassLoader):它也称为系统类加载器,负责加载应用程序classpath目录下的类和jar包,是最常用的类加载器。该类加载器可以通过ClassLoader.getSystemClassLoader()方法获取到。

这三层类加载器构成了一个层次结构,每个类加载器都有自己的父类加载器,当需要加载一个类时,JVM会先委托父类加载器加载,如果父类加载器无法加载该类,则由子类加载器进行加载。这种委托机制保证了类的唯一性和安全性。

CustomClassLoader(用户自定义类加载器):java编写,用户自定义的类加载器,可加载指定路径的class文件 JAVA编写,用户自定义的类加载器,可加载指定路径的类文件。

四、双亲委派机制


当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。

双亲委派机制的作用

1、防止重复加载同一个.class。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
2、保证核心.class不能被篡改。通过委托方式,不会去篡改核心.class,即使篡改也不会去加载,即使加载也不会是同一个.class对象了。不同的加载器加载同一个.class也不是同一个Class对象。这样保证了Class执行安全。

案例: 

五、沙箱安全机制


沙箱安全机制是一种安全措施,用于在运行不可信代码时保护系统的安全。它通过限制代码的访问权限和资源使用来保护系统,防止恶意代码对系统造成损害。 

沙箱安全机制通常包括以下几个方面:

1.代码执行环境隔离:将不可信代码运行在一个独立的、受控制的环境中,与系统其它部分隔离开来。

2.权限控制:对不可信代码的访问权限进行限制,只允许其访问必要的资源。

3.资源限制:限制不可信代码的资源使用,防止其占用系统资源导致系统崩溃或服务不可用。4.安全检查:对不可信代码进行安全检查,检查其是否存在安全漏洞或恶意行为。

Java中的沙箱安全机制是通过安全管理器(SecurityManager)来实现的。安全管理器会对Java程序访问系统资源的行为进行控制,例如文件、网络、系统属性等。通过在Java程序中设置安全策略(Policy),可以控制Java程序能够访问哪些资源,从而实现沙箱安全机制。

六、Native


Native Method Stack 本机方法栈

它的具体做法是Native Method Stack中登记native方法,在( Execution Engine )执行引擎执行的时候加载NativeLibraies[本地库]。

Native Ilnterface本地接口

本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C、C++程序,Java在诞生的时候是C、C++横行的时候,想要立足,必须有调用C、C++的程序,于是就在内存中专门开辟了块区域处理标记为native的代码,它的具体做法是在Native Method Stack 中登记native方法,在( Execution Engine )执行引擎执行的时候加载Native Libraies。 

目前该方法使用的越来越少了,除非是与硬件有关的应用,比如通过Java程序驱动打印机或者Java系统管理生产设备,在企业级应用中已经比较少见。因为现在的异构领域间通信很发达,比如可以使用Socket通信,也可以使用WebService等等,不多做介绍! 

七、PC寄存器


程序计数器: Program Counter Register 
每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向像一条指令的地址,也即将要执行的指令代码),在执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计 

八、方法区Method Area


方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间

static,final,Class,常量池
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是实例变量存在堆内存中,和防方法区无关 

九、栈(stack)


栈:先进后出
队列:先进先出( FIFO : First Input First Output )

栈:栈内存,主管程序的运行,生命周期和线程同步
线程结束,栈内存也就是释放,对于栈来说,不存在垃圾回收问题

—旦线程结束,栈就Over! 

栈内存中:
8大基本类型+对象引用+实例的方法

栈+堆+方法区:交互关系 

 

栈运行原理:栈帧
栈满了:StackOverflowError  

栈帧图解栈底部子帧指向上一个栈的方法上一个栈的父帧指向栈底部方法 

十、三种JVM


  • Sun公司HotSpot Java HotspotTM64-Bit Server VM (build 25.181-b13,mixed mode)
  • BEAJRockit
  • lBM J9VM

我们学习都是: Hotspot


十一、堆(Heap)


Heap,一个JVM只有一个堆内存,堆内存的大小是可以调节的。
类加载器读取了类文件后,一般会把什么东西放到堆中?
类、方法、常量、变量,保存我们所有引用类型的真实对象

堆内存中还要细分为三个区域:

  • 新生区(伊甸园区)Young/New
  • 养老区old
  • 永久区Perm (JDK1.8中已经被移除,被方法区的元空间取代)

堆内存详细划分

GC垃圾回收,主要是在伊甸园区和养老区

假设内存满了,OOM,堆内存不够! java.lang.OutOfMemoryError:Java heap space

永久存储区里存放的都是Java自带的例如lang包中的类如果不存在这些,Java就跑不起来了

在JDK8以后,永久存储区改了个名字(元空间)   元空间逻辑上存在 物理上不存在

1、新生区、老年区


新生区

  • 类诞生和成长的地方,甚至死亡;
  • 伊甸园,所有的对象都是在伊甸园区new出来的!
  • 幸存者区(0,1)

  • 伊甸园满了就触发轻GC,经过轻GC存活下来的就到了幸存者区
  • 幸存者区满之后意味着新生区也满了,则触发重GC,经过重GC之后存活下来的就到了养老区。
  • 重GC过后若能存放新对象,则创建成功,若失败,则出现OOM错误。

常见的OOM错误有三种:

​ java.lang.OutOfMemoryError: Java heap space——堆内存溢出

​ java.lang.OutOfMemoryError: PermGen space——元空间溢出

​ java.lang.StackOverflowError——栈溢出,一般是由于死循环或递归引起这些可以通过JVM调优进行改进。

真理:经过研究,百分之99的对象都是临时对象,大多在新生区都被消灭了

2、永久区 


这个区域常驻内存的。用来存放JDK自身携带的class对象。Interface元数据,存储的是Java运行时的一些环境,这个区域不存在垃圾回收,关闭虚拟机就会释放内存。

  • jdk1.6之前:永久代,常量池是在方法区;
  • jdk1.7:永久代,但是慢慢的退化了,去永久代,常量池在堆中
  • jdk1.8之后:无永久代,常量池在元空间
     

元空间:逻辑上存在,物理上不存在(因为存储在本地磁盘内)所以最后并不算在JVM虚拟机内存中 

jvm方法区和元空间的关系?

  • JVM方法区和元空间都是Java虚拟机中用于存储类信息的区域,但是它们的实现和作用略有不同。
  • 方法区是JVM规范中定义的一个内存区域,用于存储已加载的类信息、常量、静态变量、即时编译器编译后的代码等(元空间也类似)。它是线程共享的,是JVM内存中的一部分。在JDK8之前,方法区是使用永久代实现的,但是永久代的大小固定,不能动态调整,容易导致内存溢出。而在JDK8及以后版本中,方法区被替换为了元空间(Metaspace),元空间是使用本地内存实现的,可以动态调整大小,避免了永久代的问题。
  • 总之,方法区和元空间都是Java虚拟机中用于存储类信息的区域,但是元空间是JDK8及以后版本中替代永久代的新实现,它使用本地内存实现,可以动态调整大小,同时还提供了一些新的特性。 

十二、堆内调优 


在一个项目中,突然出现了OOM故障,那么该如何排除研究为什么出错?

  • 能够看到代码第几行出错:内存快照分析工具,MAT, Jprofiler
  • Dubug,一行行分析代码!

MAT, Jprofiler作用

  • 分析Dump内存文件,快速定位内存泄露
  • 获得堆中的数据
  • 获得大的对象

MAT是eclipse集成使用,这里不多介绍

Jprofile的使用

  1. 在idea中下载jprofile插件
  2. 联网下载jprofile客户端
  3. 在idea中vM参数中写参数-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
  4. 运行程序后在jprofile客户端中打开找到错误告诉哪个位置报错

命令参数详解

  • -Xms 设置初始化内存分配大小/164
  • -Xmx 设置最大分配内存,默以1/4
  • -XX:+PrintGCDetails //打印Gc垃圾回收信息
  • -XX:+HeapDumpOnOutOfMemoryError //oom DUMP

十三、GC垃圾回收机制


JVM在进行GC时,并不是对这三个区域统一回收。大部分时候,回收都是新生代

  • 新生代
  • 幸存区(form, to)
  • 老年区

GC两种类:轻GC(普通的GC),重GC(全局GC)

GC常见面试题目 

JVM的内存模型和分区,详细到每个区放什么?

堆里面的分区有哪些?Eden,from,to,老年区 说说他们的特点

在Java堆中,主要分为新生代和老年代两个部分。其中,新生代又可以分为Eden区、Survivor区1和Survivor区2 

  1. Eden区:Eden区是新生代中最大的一块区域,用于存放新创建的对象。当Eden区满时,会触发Minor GC,将Eden区和Survivor区中的存活对象复制到另一个Survivor区中。Eden区的特点是对象生命周期短,大多数对象都是在Eden区被创建和销毁的,因此Eden区的回收比较频繁。

  2. Survivor区1和Survivor区2:Survivor区是新生代中的一个较小的区域,用于存放Eden区和另一个Survivor区中的存活对象。当Survivor区满时,会触发Minor GC,将Survivor区中的存活对象复制到另一个Survivor区中。Survivor区的特点是存活对象的生命周期较长,因此Survivor区的回收比较少。

  3. From区和To区:From区和To区是Survivor区的两个部分,它们在不同的时间扮演不同的角色。当一次Minor GC完成后,From区中存活的对象会被复制到To区中,同时From区和To区的角色会互换。From区和To区的特点是它们的大小固定,不会随着对象的数量增加而增加。

  4. 老年区:老年区是Java堆中的一块较大的区域,用于存放长生命周期的对象。当对象在新生代中经过多次复制后还存活,就会被晋升到老年区中。老年区的特点是对象生命周期长,因此老年区的回收比较少。

GC的算法有哪些?

  • 标记清除
  • 标记压缩
  • 复制算法
  • 引用计数器

轻GC和重GC分别在什么时候发生? 

轻GC和重GC是指JVM进行垃圾回收时的两种不同方式。

轻GC通常发生在新生代,也就是Eden区和Survivor区中。当Eden区或Survivor区中的对象达到一定程度时,会触发轻GC。轻GC的过程比较快速,只会扫描并回收新生代中的无用对象,存活的对象会被复制到Survivor区或老年代中。轻GC通常不会影响应用程序的执行,因为它只会回收新生代中的对象,而新生代中的对象通常比较少。

重GC通常发生在老年代,也就是存活时间较长的对象所在的区域。当老年代中的对象达到一定程度时,会触发重GC。重GC的过程比较耗时,需要扫描整个堆内存,并回收无用对象。重GC会暂停应用程序的执行,因为在重GC的过程中,应用程序无法访问堆内存。因此,重GC的发生频率应该尽量降低,以减少对应用程序的影响。 

算法 

1.引用计数法

GC算法是指在JVM中用于垃圾回收的算法。引用计数法是一种GC算法,它的基本思想是通过计数器来记录每个对象被引用的次数。当对象被引用时,计数器加1;当引用失效时,计数器减1。当计数器的值为0时,说明该对象已经无法被访问,可以被回收

不是很常用

2.复制算法

复制算法是一种GC算法,它的基本思想是将堆内存分成两个部分,每次只使用其中一个部分,当这个部分的内存用完了,就将还存活的对象复制到另外一个部分中,然后清空原来的部分,这样就完成了垃圾回收。复制算法的优点是实现简单、高效,可以有效地避免内存碎片的问题,但是它也有缺点,即需要两倍的内存空间,且无法处理大对象的情况。因此,在实际应用中,复制算法通常用于新生代的垃圾回收。 

好处:没有内存碎片

坏处:浪费了内存空间,多了一半空间永远是空的

复制算法最佳使用场景:对象存活度较低的时候

3.标记清除法​​​​​​​

标记清除法是一种GC算法,它的基本思想是在垃圾回收时,首先标记所有仍然被引用的对象,然后清除所有未被标记的对象。具体实现时,可以从根对象开始,遍历整个对象图,将所有可达对象标记为“已标记”,然后遍历整个堆,将未被标记的对象清除。标记清除算法的优点是可以处理任意类型的对象,且不需要额外的内存空间。但是它也有缺点,即无法处理内存碎片的问题,可能会导致内存空间的浪费。因此,在实际应用中,标记清除算法通常用于老年代的垃圾回收。  

优点:不需要额外空间

缺点:两次扫描,严重浪费时间,会产生内存碎片

4.标记压缩法

标记压缩法是一种GC算法,它的基本思想是在垃圾回收时,首先标记所有仍然被引用的对象,然后将它们压缩到堆的一端,清除堆尾部分的所有对象。具体实现时,可以从根对象开始,遍历整个对象图,将所有可达对象标记为“已标记”,然后将所有已标记对象依次复制到堆的一端,并记录它们在新堆中的地址,最后清除堆的尾部。标记压缩算法的优点是可以解决内存碎片的问题,且不需要额外的内存空间。但是它也有缺点,即需要在垃圾回收时进行复制和压缩操作,可能会影响程序的性能。因此,在实际应用中,标记压缩算法通常用于新生代和老年代的垃圾回收。

优点:不会产生内存碎片

缺点:需要三次扫描

总结 

  • 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
  • 内存整齐度:复制算法=标记压缩算法>标记清除算法
  • 内存利用率:标记压缩算法=标记清除算法>复制算法

年轻代:存活率低,使用复制算法

老年代:区域大,存活率高,使用标记清除+标记压缩混合实现

十四、JMM 


JMM(Java Memory Model)是Java内存模型的缩写,是Java程序中处理多线程并发访问共享内存的规范。JMM规定了在何时,如何以及何种方式访问共享内存,以确保多线程程序的正确性。

JMM规定了一组规则和语义,以确保多线程程序中的内存访问操作的可见性、有序性和原子性。其中,可见性指的是一个线程对共享变量的修改对另一个线程是可见的;有序性指的是程序中的指令执行顺序必须符合一定的规则;原子性指的是一个操作必须是不可分割的整体,要么全部执行成功,要么全部执行失败。

JMM规范包含了一些基本概念,如主内存、工作内存、内存屏障等,以及一些操作,如读操作、写操作、volatile变量的读写操作等。JMM规范的正确理解和应用对于编写正确的多线程程序非常重要。

它是干嘛的?​​​​​​​

缓存一致性协议,用于定义数据读写的规则

JMM定义了线程工作内存和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory)

解决共享对象可见性这个问题: volilate(volatile是一种轻量级的同步机制,它可以保证多个线程能够正确地处理共享变量)

JMM和JVM的区别在于:

  1. JMM是Java程序中多线程并发访问共享内存的规范,而JVM是Java程序的运行环境。

  2. JMM定义了Java程序中多线程并发访问共享内存的行为,包括内存模型、内存屏障、变量可见性、原子性、有序性等,而JVM实现了JMM规范中定义的Java内存模型和内存屏障等机制。

  3. JMM是Java程序的理论基础,JVM是Java程序的具体实现。在编写Java程序时,我们需要遵循JMM规范,而在运行Java程序时,我们需要使用JVM来执行程序。

总之,JMM和JVM是密切相关的,但是它们是不同的概念。JMM规范定义了Java程序中多线程并发访问共享内存的行为,而JVM实现了JMM规范中定义的Java内存模型和内存屏障等机制。

结束!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/653810.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码靠谱吗?实操一遍就知道了

一、前言 最近一段时间,“低代码”概念特别流行,有些人特别推崇它,也有些人对此不屑一顾。 推崇它的人认为,它有很多优点,比如说能够降低开发周期,提高系统开发效率,降低开发成本,学…

使用HBuilder将h5网站打包成app 自行打包

1、点击manifest.json,基础配置,APP名字,是否全面屏 2、然后点击图标配置,选好后点自动生成所有图标并替换 点击模块配置,选VideoPlayer和X5内核 然后顶部菜单选发行,选择原生App-云打包 选公测证书然后…

WPF教程-XAML介绍

XAML介绍 1.定义 为构建应用程序用户界面而创建的一种新的“可扩展应用程序标记语言”,提供一种便于扩展和定位的语法来定义和程序业务逻辑分离的用户界面。 XAML 是一种 XML(Extensible Markup Language)的扩展,XAML 是 WPF 中…

云计算——云计算与虚拟化的关系

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 一.虚拟化 1.什么是虚拟化 2.虚拟化技术作用 二.云计算与虚拟化的关系 三.虚…

一文让非技术宅读懂为什么AI更“喜欢”GPU而不是CPU?

一、引言 随着人工智能(AI)技术的快速发展,深度学习等算法在图像识别、自然语言处理、数据挖掘等方面表现出了强大的能力。而这些算法的底层计算,往往对硬件有着极高的要求。为了满足这些需求,越来越多的研究和工程实…

关于不同型号电脑谷歌浏览器下载指定版本的方法(超详细教程)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1、根据链接打开地址2、页面说明3、下载过程(1)选中指定版本点击它(这里以52.0.27.37.1为例)(2&…

美国访学博后答疑|尚未出国DS-2019表格过期了怎么办?

美国执J1签证者尚未出国,但DS-2019表格过期了怎么办?本篇知识人网老师就以下三种情况,统一做答疑建议。 美国访问学者和博士后的签证类型多是J1签证,需要由美国接收方将签字后的DS2019表邮寄给国内,申请者本人在表格正…

多项安全新功能为云上安全保驾护航,就在亚马逊云科技re:Inforce全球大会

亚马逊云科技re:Inforce 2023全球大会于当地时间2023年6月13日在美国加州安纳海姆拉开帷幕。在大会上,亚马逊云科技宣布推出十多项安全新服务及功能,下面就来一览本次大会的风采。 “Security is our top priority.” “安全是我们的首要优先级”&#…

Socket 传情:使用 Python 发送 GET 请求

文章目录 参考描述HTTPHTTP 报文HTTP 请求报文请求行请求头空行请求体 HTTP 响应报文状态行响应头空行响应体 HTTP 请求方法HTTP 与 TCP 协议HTTP 协议TCP 协议 httpbin.org socket 模块socket.socket()Socket().connect()Socket().send() 与 Socket().sendall()Socket().recv(…

AI实战营第二期 第十节 《MMagic 代码课》——笔记11

AI实战营第二期 第十节 《MMagic 代码课》 MMagic (Multimodal Advanced, Generative, and Intelligent Creation) 是一个供专业人工智能研究人员和机器学习工程师去处理、编辑和生成图像与视频的开源 AIGC 工具箱。 MMagic 允许研究人员和工程师使用最先进的预训练模型&…

wms add window 流程

二、WMS 窗口添加流程 /frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,boolean andResume, boolean checkConfig) throws RemoteException {.....…

ESP-C2模组 AT示例程序

ESP32C2 AT固件使用 ESP32 C2模组,如图1-1所示 图1-1 ESP32 C2模组 ESP32 C2开发板,如图1-2所示 图1-2 ESP32 C2开发 方案亮点 1、完整的 WiFi 子系统,符合 IEEE 802.11b/g/n 协议,具有 Station 模式、SoftAP 模式、SoftAP Stat…

2023电商运营课程培训课程干货

​电商运营是当今社会最为火热的词汇之一,在各个领域有着广泛的运用。各种途径的线上销售使得产品的销售以及品牌的推广变得更加容易,因此越来越多的人选择从事电商运营。而电商运营的成功离不开专业的培训,为此许多机构推出了电商运营课程培…

python数据结构详解

Python是一种高级编程语言,它具有简单易学的语法和强大的数据结构。在Python中,数据结构是指一组数据和与之相关的操作的集合。Python提供了许多数据结构,包括列表、元组、字典、集合和字符串。本文将深入介绍Python中的数据结构,…

离散数学题目收集整理练习(期末过关进度40%)

✨博主:命运之光 🦄专栏:离散数学考前复习(知识点题) 🍓专栏:概率论期末速成(一套卷) 🐳专栏:数字电路考前复习 ✨博主的其他文章:点击…

ubuntu18.04设置自启动踩坑贴(拿来即用)---全网搜索半天都没有,ChatGPT回答都是有问题的!!

前言:其实很简单,全网的资料实在坑太多(无语),有一篇还不错,我大多数借鉴这篇https://cloud.tencent.com/developer/article/1803805,但直接用貌似也不通,这边记录了我的实测可跑通版…

【AIGC】BaiChuan7B开源大模型介绍、部署以及创建接口服务

模型介绍 baichuan-7B是由百川智能开发的一个开源的大规模预训练模型。基于Transformer结构,在大约1.2万亿tokens上训练的70亿参数模型,支持中英双语,上下文窗口长度为4096。在标准的中文和英文权威benchmark(C-EVAL/MMLU&#x…

游戏革命2023:AIGC拯救游戏厂商

文明史即工具史,纵观人类社会的演化,每一次的加速迭代,都有赖于关键性的技术突破。 前有蒸汽机到电力普及的生产力大爆发,以及计算机、互联网的诞生打开新世界,如今AIGC将再次推动先进技术工具的变革。 随着ChatGPT的…

​​​​​​​微信怎么快捷回复?

怎么快速的回复客户一直问的问题,还在一个个回,我直接把常问问题的回复编辑好,直接一秒搞定回复,客户还以为我敲字速度杠杠的 #快捷回复 #微信怎么快速回复信息 #话术

深入理解Java虚拟机jvm-对象的内存布局

对象的内存布局 对象头(Header)实例数据(Instance Data)对齐填充(Padding) 在HotSpot虚拟机里,对象在堆内存中的存储布局可以划分为三个部分:对象头(Header)、…