「java本地内存是什么」java内存有哪些

博主:adminadmin 2022-11-29 18:50:09 78

本篇文章给大家谈谈java本地内存是什么,以及java内存有哪些对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Java内存划分到底是4个部分还是5个部分?

Java把内存划分成两种:一种是栈内存,一种是堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。具体的说:栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int,short,long,byte,float,double,boolean,char)和对象句柄。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:inta=3;intb=3;编译器先处理inta=3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理intb=3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b,它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

架构图汇总

一,java内存模型

由于java1.8对java内存模型进行了改动,我们这里分开来说明,首先来看java1.8之前的java内存模型。

1,java1.8之前的内存模型

关于java内存模型,有一点,要提一下,那就是,线程之间的通信机制。也就是说:线程之间是如何通信的?

答:共享内存和消息传递。

共享内存通信,指的是各线程之间通过共享内存这一块区域,来进行隐式通信。线程之间通过读写共享内存来进行通信。在java中,典型的应用就是通过共享对象来进行通信。这里要搞清楚2个概念,共享内存和本地内存。共享内存是各线程共享的公共区域。本地内存是线程独享的,其他线程不能访问。

消息传递通信,指的是线程之间必须通过明确的发送消息来进行显示通信。这种通信方式,线程之间没有共享对象,而是通过wait()、notify()等方法,显式的告诉其他线程来进行通信。

2,java1.8的内存模型

java1. 8移出了内存模型中的方法区,引入了元空间的概念。元空间使用的是操作系统的内存,而不是jvm内存。指定元空间的大小,通过下面这个jvm参数:

-XX:MetaspaceSize

还有一个关键点,就是常量池。在java1.7之前,常量池位于方法区。从java1.7开始,常量池位于堆中。

二,java对象的结构

java对象的结构

对象头的结构

Mark Word

三,双亲委派模型

什么是双亲委派模型?

为什么叫双亲委派模型?

双亲指的是谁?

四,类的生命周期

java类的生命周期:加载-连接-初始化-使用-卸载。

如下图:

五,Eureka架构图

这个架构图是结合源码画出的,个人觉得还是很不错的。

六,Kafka架构图

注意:只有broker和consumer需要向Zookeeper集群注册。生产者无需注册到Zookeeper。

七,Spring Cloud微服务架构图

1. Java有几种内存?每一种内存有什么功能?哪一种内存速度快?

有六个地方都可以存储数据:

(1) 寄存器(Registers)。这是速度最快的存储场所,因为寄存器其他所有存储媒介都不同:它位于处理器内部。不过,寄存器的数量十分有限,所以寄存器是根据需要由编译器适当地分配。作为一个程序员,我们对此没有直接的控制权,也没办法在程序里头感觉到寄存器的任何存在迹象。

(2) Stack(栈)。位于一般的RAM(random-access memory,随机访问内存)中。处理器通过其指针(“栈指针”,stack pointer)获得处理的直接支持。栈指针若向下(后)移,会分配新的内存;若向上(前)移,则会释放那些内存。这是一种特别快、特别有效率的数据存储方式,速度仅次于寄存器。由于Java编译器有责任产生“将stack指针前后移动”的程序代码,所以它必须能够完全掌握它所编译的程序中“存在stack里头的所有数据的实际大小和存活时间”。如此一来便会限制程序的弹性。由于这个限制,尽管有些Java数据要存储在栈里——特别是对象句柄,但Java对象并不放到其中。

(3) Heap(堆)。Heap是一种通用性质的内存存储空间(也存在于RAM中),用来置放所有Java对象。“内存堆”或“堆”(Heap)胜过stack之处在于,编译器不需知道究竟得从堆里分配多少存储空间,也不需知道从堆上分配的空间究竟要存活多长的时间。因此,用堆存储数据时会得到更大的灵活性。要求创建一个对象时,只需用new即可。执行这些代码时,会在堆里分配空间。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会比从栈里分配花掉更长的时间(假设你真的可以在Java中像C++一样地从stack上产生对象的话)!

(4) 静态存储空间(Static storage)。这儿的“静态”(Static)是指“位于固定位置”(也在RAM里头)。静态存储空间存放着“程序运行期间”一直存在的数据。可用static关键字将某个对象内的特定成员设为静态,但Java对象本身永远都不会置入静态存储空间。

(5) 常量存储空间(Constant storage)。常量值通常被直接置于程序代码里头。因为它们永远都不会改变,所以也是安全的。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(read-only memory,ROM)中。

(6) 非RAM存储空间(Non-RAM storage)。若数据完全存活于程序之外,则程序不运行时数据仍继续存在,脱离了程序的控制范围。其中两个最主要的例子便是“串流化对象(streamed objects)”和“持久性对象(persistent objects)”。在串流化对象形式中,对象会被转换为一连串的字节(bytes)流,这些bytes通常会被传送给另一台机器。而在持久性对象形式中,对象被存储于磁盘,即使程序运行结束,这些对象还能够继续保有。这种类型的存储空间的特点在于,它们能够将对象转换为可存储于其他媒介的形式,并在需要时,将所存储的数据还原成可存储于RAM中的一般对象。Java提供了对“轻量级持久性(Lightweight persistence)”的支持。新版本有可能提供更完善的解决方案。

针对你的补充我也补充一下:堆内存和栈内存确实是我们常常用的东西,比如

Animal a = new Animal();

这个时候相当于在堆内存中开辟了一个空间保存了Animal的信息以及着块空间的内存地址,然后在栈内存中划了一小快空间保存了堆中的内存地址,这个时候我们就可以说引用a指向Animal()了.

可是有时候,有个静态类.Animal,里面有个静态方法speak();

那么可以这么直接调用Animal.sepak();

这个时候既没有new,也没有Animal a=??;

所以既没有在堆中开辟空间也没有在栈内存中开辟空间 ,

可是方法确实能执行,一切程序都运行在内存里,那么证明有新的内存区,就是静态空间了.

当然还有常量什么的等等

什么是Java内存模型?

1.java内存模型简称JMM

2.通俗点讲就是指你代码中写的那些内容在内存中是怎么存储的

3.比如说 Student stu = new Student();int a = 5; 你新建了一个学生类,建立了一个变量a,这些内容在内存中是咋存储的,

4.大的来说JMM分为堆栈,一般情况下学生类分配在堆,变量a分配在栈,

java内存模型里面为什么要分主存和本地内存

你说的应该是主存和工作内存吧,主存是公共空间,基本可以类比为虚拟机模型中的堆,对象创建好了都是在主存里,所有线程都可以访问,工作内存是线程的私有内存,只有本线程可以访问,如果线程要操作主存中的某个对象,必须从主存中拷贝到工作内存,在对工作内存中的副本进行操作,操作后再写入主存,而不能对主存的对象直接操作

jvm中线程本地内存是真实存在的,还是一个抽象概念

jvm内存模型:Java代码是运行在Java虚拟机之上的,由Java虚拟机通过解释执行(解释器)或编译执行(即时编译器)来完成,故Java内存模型,也就是指Java虚拟机的运行时内存模型。

运行时内存模型,分为线程私有和共享数据区两大类,其中线程私有的数据区包含程序计数器、虚拟机栈、本地方法区,所有线程共享的数据区包含Java堆、方法区,在方法区内有一个常量池。java运行时的内存模型图,如下:

从图中,可知内存分为线程私有和共享两大类:

(1)线程私有区,包含以下3类:

程序计数器,记录正在执行的虚拟机字节码的地址;

虚拟机栈:方法执行的内存区,每个方法执行时会在虚拟机栈中创建栈帧;

本地方法栈:虚拟机的Native方法执行的内存区;

(2)线程共享区,包含以下2类

Java堆:对象分配内存的区域;

方法区:存放类信息、常量、静态变量、编译器编译后的代码等数据;

常量池:存放编译器生成的各种字面量和符号引用,是方法区的一部分。

楼主提到的Java栈,一般而言是指图中的虚拟机栈,在代码中的方法调用过程中,往往需要从一个方法跳转到另一个方法,执行完再返回,那么在跳转之前需要在当前方法的基本信息压入栈中保存再跳转。

三、关于寄存器的问题

对于java最常用的虚拟机,sun公司提供的hotspot虚拟机,是基于栈的虚拟机;而对于android的虚拟机,则采用google提供的dalvik,art两种虚拟机,在android 5.0以后便默认采用art虚拟机,这是基于寄存器的虚拟机。 楼主问的是jvm(即java vm),这是基于栈的虚拟机。那么关于虚拟机栈,这块内存的内容,我们再进一步详细分析,如下图:

可以看到,在虚拟机栈有一帧帧的 栈帧组成,而栈帧包含局部变量表,操作栈等子项,那么线程在运行的时候,代码在运行时,是通过程序计数器不断执行下一条指令。真正指令运算等操作时通过控制操作栈的操作数入栈和出栈,将操作数在局部变量表和操作栈之间转移。

关于java本地内存是什么和java内存有哪些的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-11-29,除非注明,否则均为首码项目网原创文章,转载请注明出处。