「java比较内存」java内存与缓存区别
本篇文章给大家谈谈java比较内存,以及java内存与缓存区别对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、问个有关JAVA内存存储和关系比较的小问题。
- 2、JAVA之堆内存和栈内存的区别
- 3、一个开发java的人需要多大内存?
- 4、java Object里的equals比较的是对象的哈希值还是物理内存? "==" 比较的又什么?
- 5、JDK1.6、JDK1.7、JDK1.8 内存模型对比
- 6、String类型在Java中对象的比较的内存中的运行情况
问个有关JAVA内存存储和关系比较的小问题。
这不关是不是变量的问题,
JDK5 之后 基础类型和基包装类型会运算的时候boxing 和 unboxig.
当 基本类型 int 和 对象类型的Integer 比较时Integer 会自动unboxing ,对于基本类型的数据当然是比较值,而不是地址了。
java 中的基本类型有 boolean ,byte,int double,float,long 这些你都可以试验证一下,结果都是一样的 .例如:
boolean b=false;
Boolean b2 = new Boolean(false);
Boolean b3 = new Boolean(false);
System.out.println(b==b2);
System.out.println(b3==b2);
JAVA之堆内存和栈内存的区别
堆和栈的区别(内存和数据结构)
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助。
数据结构的栈和堆
首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。
堆和栈都是一种数据项按序排列的数据结构。
栈就像装数据的桶或箱子
我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。
堆像一棵倒过来的树
而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。
内存分配中的栈和堆
然而我要说的重点并不在这,我要说的堆和栈并不是数据结构的堆和栈,之所以要说数据结构的堆和栈是为了和后面我要说的堆区和栈区区别开来,请大家一定要注意。
下面就说说C语言程序内存分配中的堆和栈,这里有必要把内存分配也提一下,大家不要嫌我啰嗦,一般情况下程序存放在Rom或Flash中,运行时需要拷到内存中执行,内存会分别存储不同的信息,如下图所示:
内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的。
栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。
一个开发java的人需要多大内存?
最少是4G。
分析:
java开发需要安装jdk、eclipse、oracle等软件;
java运行需要tomcat 、JVM和程序的运行内存;
以上的这些软件基本都运行起来的话,大概需要2G多内存,而电脑本身还需要一部分,所以最低配置也得4G,建议开发用6G或者是8G。
java Object里的equals比较的是对象的哈希值还是物理内存? "==" 比较的又什么?
== 和 Equals 的区别
1. == 是一个运算符。
2.Equals则是string对象的方法,可以.(点)出来。
我们比较无非就是这两种 1、基本数据类型比较 2、引用对象比较
1、基本数据类型比较
==和Equals都比较两个值是否相等。相等为true 否则为false;
2、引用对象比较
==和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false;
需注意几点:
1、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;
2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。
所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;
3、基本数据类型比较(string 除外) == 和 Equals 两者都是比较值;
JDK1.6、JDK1.7、JDK1.8 内存模型对比
如图25-1 是 JDK 1.6、1.7、1.8 的内存模型演变过程,其实这个内存模型就是 JVM 运行时数据区依照JVM虚拟机规范的具体实现过程。
JDK 1.6:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区[永久代](字符串常量池、静态变量、运行时常量池、类常量池)
JDK 1.7:程序计数器、Java虚拟机栈、本地方法栈、堆(字符串常量、静态变量)、方法区[永久代](运行时常量池、类常量池)
JDK 1.8:程序计数器、Java虚拟机栈、本地方法栈、堆(字符串常量)、元数据(静态变量、运行时常量池、类常量池)
JDK 1.8 JVM 的内存结构主要由三大块组成:堆内存、元空间和栈,Java 堆是内存空间占据最大的一块区域。
Java 堆,由年轻代和年老代组成,分别占据1/3和2/3。
年轻代又分为三部分, Eden 、 From Survivor 、 To Survivor ,占据比例为8:1:1,可调。
元空间从虚拟机Java堆中转移到本地内存,默认情况下,元空间的大小仅受本地内存的限制,说白了也就是以后不会因为永久代空间不够而抛出OOM异常出现了。 jdk1.8以前版本的 class和JAR包数据存储在 PermGen下面 ,PermGen 大小是固定的,而且项目之间无法共用,公有的 class,所以比较容易出现OOM异常。
升级JDK 1.8后,元空间配置参数,-XX:MetaspaceSize=512M XX:MaxMetaspaceSize=1024M。
小技巧通过jps、jinfo查看元空间,如下:
通过jinfo查看默认MetaspaceSize大小(约20M),MaxMetaspaceSize比较大。
其他:关于JDK1.8 元空间的介绍: Move part of the contents of the permanent generation in Hotspot to the Java heap and the remainder to native memory.
String类型在Java中对象的比较的内存中的运行情况
这里涉及到java内存分配的问题
首先你要知道"1"是字符串常量
是存放在数据段的,或者叫常量池
当程序中出现"1"时虚拟机就去内存里找有没有现成的"1",有就不创建了
所以s1,s2指向的是同一内存空间
equals()的默认实现就是==,==比较的是对象的hashcode,可以简单理解为地址,或者说对象引用里的内容,而不是对象里的内容,ss1和ss2是两个对象,占据了堆内存中的两块内存空间(局部变量ss1,ss2在栈内存),所以s1==s2,ss1!=ss2
equals()方法是想要比较对象里的内容相等否,一般由用户重写实现,另jvm已经对String和Date这两个常用对象的equals()进行了重写,方法体中比较的是对象内容,所以s1 equals s2,ss1 equals ss2
关于java比较内存和java内存与缓存区别的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-25,除非注明,否则均为
原创文章,转载请注明出处。