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

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

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

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

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

那么可以这么直接调用Animalsepak();

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

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

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

当然还有常量什么的等等

栈内存你可以想象成电脑的内存,堆内存你可以看成硬盘,

Java的内存分配上,主要分4个块!

一块是用来装代码的,就是编译的东西。

一块是用来装静态变量的,例如用static关键字的变量,例如字符串常量。

一块是stack,也就是栈,是用来装变量和引用类型的!但区别在于,装了变量以后,变量上是有值的,而引用类型本身在stack上是没有值的。

一块是heap,也就是堆!堆可以一句话概括,装new出来的东西!

所以综上所述,基本数据类型都在stack中,而引用类型,变量是放在stack中,真正有内容的东西放在heap中,也就是当new了一个新的引用类型,他就会放在堆中,同时栈中的引用类型变量会指向堆中你new出来的东西!

这样说希望能帮你了解到java的内存分配问题。

这个要看你的需求是什么了?我之前也遇到过这种问题,是通过分页+手动释放内存处理的,sql分页就不说了,手动释放内存是用迭代器的形式,每次遍及一条数据处理玩后直接remove掉,这样就形成了边遍历边释放内存的情况,如果不这么弄,内部遍历不处理,到时候这个list的垃圾对象就会变得异常大,如果不回收及时,一样oom

记得之前的远标老师教过我这一块,问了一下。是这样回答的

你创建一个servlet的时候,添加一个init()方法,init方法中执行查询数据库的方法,把数据导入内存。

默认情况下servlet被加载是在第一次请求访问到来得时候,不过可以使用xml文件中配置

<load-on-startup>-1</load-on-startup>

是其在启动tomcat服务的时候就加载servlet就可以了。

内存数据库有现成的redis,高效存取键值对,键设为你的查询条件,值设为你的查询结果转为字符串

查询时先从redis取,没有再查数据库,并且设置redis的过期时间,这种方式需要项目对实时性要求不高,这样你才能用缓存,而且如果你的项目没有明显的热点,即没有某些内容确定会多次被查到,那你缓存就不会命中,添加缓存反而影响你得速度

redis是一种nosql的内存数据库,感兴趣你可以了解一下,优点就是性能强劲

数据查询请求多就把结果缓存下来,你查数据库再快也没有直接把结果从内存读出来快

同样的sql请求只有第一次查数据库,之后通通读内存

或者你干脆借助这种思想,创建一个全局的map对象,然后查询条件作key

,结果作value,就省去了了解redis的过程,把整个数据库装内存不太科学,你有多少条数据啊

内存是如何分配的:1 寄存器 - registers 反应最快的存储,在处理器里,数量有限,由编译器分配2 栈 - stack 位于常规内存区-general random-access memory area 处理器通过栈指针对他进行直接存储 仅次于寄存器的速度和效率 被存储在栈中的数据的大小和生命周期必须是已知的 Java把某些--特别是referenc存放在栈里,但对象本身并没有放在栈里。 3 堆 - heap 多用途的内存池 - general-purpose pool of memory 保存所欲的Java对象 同栈比较,优点是:分配空间的时候,编译器无需知道该分配多少空间,已经存放的时间 用关进字new来分配、 比栈要慢,C++中能在stack里创建对象就会快很多。4 静态存储 - static storage 静态就是“在固定”的位置 数据在整个程序的运行期间都能访问 关键字static,但Java对象本身是不会放到静态存储中5 固定存储 - constant storage constant常量值通常直接放在程序里,不会被改动,因而安全 在嵌入式系统中,能选择是不是把他们放到ROM中6 非内存的存储 数据完全独立于程序:流对象-streamed object 和persistent object 由对象转化而成的字节流;persistent objec 保存在磁盘上,需要时在内存里重建

您好,提问者:

这个就像List,肯定是存放的引用地址

Person[] p = new Person[2];是开辟2个数组p空间,值为null。

下面代码是存放的对象的引用地址。

以上就是关于1. Java有几种内存每一种内存有什么功能哪一种内存速度快全部的内容,包括:1. Java有几种内存每一种内存有什么功能哪一种内存速度快、java不同的对象在内存中保存的位置、JAVA保存对象太大,内存溢出等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9589407.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存