jvm中的堆和栈

转载 2015年11月17日 21:51:06

   jvm是基于堆栈的虚拟机,堆和栈都是java中用来存储数据的地方.
(1)堆的特点:

       每个java应用进程(一个main线程以及它的子线程)对应一个堆,堆的大小可以通过参数-xms,-xmx来设置。 java中所有通过new出来的对象和数组都存在堆中,可以为各线程共享,堆中的内存空间通过垃圾回收器进行回收。
(2)栈的特点:

       栈是线程私有的,栈的生命周期就是线程的生命周期,可以通过-Xss来分配每个线程的栈空间,如果某个线程的栈空间不足,系统会抛StackOverFlowError异常。栈中是以栈帧为单位进行维护的,java中没调用以方法就会创建一个栈帧,用于存储局部变量区,操作数,等,所以可以说,java中方法的调用过程,其实就是对栈的操作过程(分为压栈和出栈)。基本类型(如short,int...)和对象的引用的保存在栈中,由于这些数据都有已知的固定的大小,栈中的存取速度较快,栈还有一个特点,就是存在栈中的数据可以共享,而堆却不可以,共享的意思就是讲相同的数据可以共用同一内存块, 比如 :
int a=1; 
int b=1; 
上面过程建立了a和b两个引用,当执行b=1的时候,会先去栈中找是否存在1的值,如果存在,就不会开辟新的内存块给1了,而是直接使用之前的内存,把它的地址直接赋给b,所以a引用和b引用指向相同的内存地址,这也就不难解释a==b的道理了。 
还有String的情况, 比如: 
String c = "aaa"; 
String d = "aaa"; 
这里的c==d也是为true,也可用上面的原理来解释,就是说当以上面的方式来创建字符串的时候,jvm会将创建的字符串保存在栈中,并拥有的栈中共享的特点,所以c==d,但是通过new String("aaa")的方式的话就比较麻烦了,首先会在栈中寻找或者创建(不可能之间建过,就可公用)一个"aaa",然后用它来在堆中又新建(肯定开辟新的空间)一个字符串。

 

JVM的堆和栈以及GC算法的介绍

JVM就是java虚拟机,我们可以把它理解成一个操作系统,每个不同的平台都有不同的JVM,比如linux系统和windows系统,就是因为这个原因所以java程序就有了一个很突出的特性就是 跨平台性其...
  • qq_20641565
  • qq_20641565
  • 2017年03月04日 17:17
  • 1818

Java JVM 中 堆,栈,方法区 详解

一 jvm运行时数据区有哪些我们先来看一张图 JVM运行时数据区分类 1. JVM栈 (Java Virtual Machine Stacks) 2. 堆内存 (Heap Memory)...
  • zhangqiluGrubby
  • zhangqiluGrubby
  • 2017年03月01日 16:45
  • 3573

jvm中的堆和栈

1.    jvm堆与栈的基本区别:     jvm堆是存世单位   jvm栈是运行单位.      JVM堆 解决的是数据的存储问题,也就是数据放在哪,怎么放.      JVM栈 解决的是...
  • csdn98313
  • csdn98313
  • 2016年10月26日 10:14
  • 126

深入JVM——栈和局部变量

java栈概述          记得当初我学习java时,常常听见身边的朋友说:“你要记住,当new一个对象时,对象的引用存放在栈里,而对象是存放在堆里的”。当时,听到这句教导时,脑海里立即出现...
  • f525921307
  • f525921307
  • 2016年05月06日 11:34
  • 1025

深入理解JVM内幕

每个Java开发者都知道Java字节码是执行在JRE((Java Runtime Environment Java运行时环境)上的。JRE中最重要的部分是Java虚拟机(JVM),JVM负责分析和执行...
  • zhoudaxia
  • zhoudaxia
  • 2014年05月25日 10:58
  • 38158

java虚拟机 jvm 出入java栈 栈空间内存分配

java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关。线程最基本的执行行为就是函数的调用。每次函数调用其实是通过java栈传递数据的。 数据结构中...
  • qq_30739519
  • qq_30739519
  • 2016年04月02日 08:59
  • 5527

JVM 栈介绍

转载http://www.blogjava.net/nkjava/archive/2012/03/15/371971.html JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM...
  • ie_fmg
  • ie_fmg
  • 2015年03月11日 21:17
  • 627

JVM中堆内存和栈内存详解

Java中堆内存和栈内存详解 Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时...
  • zh521zh
  • zh521zh
  • 2015年07月23日 18:21
  • 1705

Java堆和栈的区别(JVM运行时数据区域)

程序计数器:可以看做当前线程运行所执行的字节码的行号指示器,在虚拟机的概念模型中,字节码解释器工作时就是 通过改变这个计数器的值来选取下一条需要执行的字节码指令。由于JVM多线程是通过线程轮流切换...
  • haiyoung
  • haiyoung
  • 2016年10月19日 19:57
  • 1114

jvm 堆、栈、方法区、程序计数器

最近在读周志明的《深入理解Java虚拟机:JVM高级特性与最佳实践》,从中学到了很多,有些人可能会问为什么我们要学习JVM,他有什么用?在这里我想说一下,并不是这本书是大家都推荐的说有用处,我们才去读...
  • shuxingcq
  • shuxingcq
  • 2017年07月17日 14:21
  • 217
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:jvm中的堆和栈
举报原因:
原因补充:

(最多只允许输入30个字)