java核心(五):堆内存、栈内存;String赋值时,内存变化

1、什么是堆内存、栈内存?
  Java把内存划分红两种:一种是堆内存,一种是栈内存。
   堆:主要用于存储实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个堆内存,线程是能够共享数据的。
   栈:主要用于存储局部变量和对象的引用变量,每一个线程都会有一个独立的栈空间,因此线程之间是不共享数据的。
   在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的做用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间能够当即被另做他用。
   堆内存用来存放由 new 建立的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象以后,还能够在栈中定义一个特殊的变量(变量的引用),让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,之后就能够在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就至关因而为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其做用域以外后被释放。而数组和对象自己在堆中分配,即便程序运行到使用 new 产生数组或者对象的语句所在的代码块以外,数组和对象自己占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不肯定的时间被垃圾回收器收走(释放掉)。
 
2、堆、栈的特色
  • 堆:FIFO队列优先,先进先出。jvm只有一个堆区被全部线程所共享!堆存放在二级缓存中,调用对象的速度相对慢一些,生命周期由虚拟机的垃圾回收机制定。
  • 栈:FILO先进后出,暂存数据的地方。每一个线程都包含一个栈区!栈存放在一级缓存中,存取速度较快,“栈是限定仅在表头进行插入和删除操做的线性表”。

3、堆、栈的优缺点html

  • 堆的优势-能够动态的分配内存大小,生命周期不肯定。缺点-速度略慢
  • 栈的优势-速度快,缺点-存在栈中的数据大小和生命周期必须是明确的,缺乏灵活性。

 
4、java中变量在内存中的分配
  • 类变量(static修饰的变量):在程序加载时,系统就为它在堆中开辟了内存堆中的内存地址存放于栈以便于高速访问。静态变量的生命周期--一直持续到整个"系统"关闭
  • 实例变量:当你使用java关键字new的时候,系统在堆中开辟并不必定是连续的空间分配给变量(好比说类实例),而后根据零散的堆内存地址,经过哈希算法换算为一长串数字以表征这个变量在堆中的"物理位置"。 实例变量的生命周期--当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并非立刻就释放堆中内存
  • 局部变量:局部变量,由声明在某方法,或某代码段里(好比for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离做用域,内存当即释放

5、直接内存java

  直接内存并非虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中农定义的内存区域。在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O 方式,它可使用native 函数库直接分配堆外内存,而后通脱一个存储在Java堆中的DirectByteBuffer 对象做为这块内存的引用进行操做。这样能在一些场景中显著提升性能,由于避免了在Java堆和Native堆中来回复制数据。算法

  本机直接内存的分配不会受到Java 堆大小的限制,受到本机总内存大小限制windows

  配置虚拟机参数时,不要忽略直接内存 防止出现OutOfMemoryError异常数组

6、直接内存(堆外内存)与堆内存比较缓存

  • 直接内存申请空间耗费更高的性能,当频繁申请到必定量时尤其明显
  • 直接内存IO读写的性能要优于普通的堆内存,在屡次读写操做的状况下差别明显

7、String赋值时,内存变化jvm

 

8、更多介绍函数

相关文章
相关标签/搜索