基础知识:

关于堆和栈,堆和栈是程序运行的关键,关于堆和栈的定义和解释可自行搜索,我比较认可以程序运行过程中他们扮演的角色作为对比的点:堆是存储的单位,而栈是程序运行时的单位。栈解决的是程序的运行问题,即程序如何运行,如何处理数据。堆解决的是存储问题,即数据存储在哪里,怎么存储。

程序中每启动一个线程就有一个栈与之对应。因为每个线程执行的逻辑不同,所以需要独立的栈来描线程如何运行。而堆是所有线程共享的。

栈之所以是运行时单位,主要是因为栈中保存的都是当前线程中,包括局部变量,程序运行状态和方法返回值。而堆用来存储对象信息。

堆和栈的关系:

1.从软件设计的角度看,栈代表了处理逻辑,堆代表了数据。这样分开使得处理逻辑更加清晰。分而治之的思想体现。

2.栈与堆的分离,使堆中的数据被多个栈共享。栈的存取速度相当快,仅次于cpu中的寄存器,但是栈的大小是有限制的,不可能过多地存储数据,堆的出现则解决了这个问题,堆中的数据可以被多个栈共享,节约了栈的空间。另外也为数据的交换提供了一种方案。

3.栈是运行时单位,也就是随着程序运行,程序进行系统上下文切换时都需要对地址段进行划分,由于栈是向上增长的,就会限制栈存储内容的能力。而堆可以动态增长,栈只要记录一下堆中的地址。

4.面向对象就是堆和栈的优势互补。面向对象程序和结构化程序的运行基本是一样,只是面向对象的思考方式更接近自然思考的方式。比如java中的一个类的对象,对象的属性就是数据,对象的方法就是逻辑。属性保存在堆里,而方法保存在栈中。

堆中存储对象,栈中存储的是基本数据类型和对象引用。

java中传递参数到底是值传递还是引用传递呢?

java中没有指针的概念,程序永远是在栈中运行的,因此在参数传递的时候,只能是值传递,即传递基本数据类型和对象引用,不会直接传递对象。

基本数据类型的传递和对象引用的传递都是传值。

堆和栈中,栈是程序运行的最根本的东西。程序可以没有堆,但是不能没有栈。堆是为栈服务的,堆里存储的数据,就是用来被所有的栈共享的。

在java中,可以通过-Xss来设置栈的大小。如果栈中存储的数据过多,就会报出java.lang.StackOverflowError。所以在部署线上应用前,请根据实际情形适当调整栈大小。

java调优随记-堆和栈的更多相关文章

  1. java调优随记-java对象大小

    在java中,基本数据类型的大小是固定.但是java对象的大小是不固定的,需要通过计算. 在java中,一个空对象(没有属性和方法的对象)在堆中占用8byte,比如 Object obj = new ...

  2. Java调优

    Java调优经验谈 对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题 ...

  3. 7.JVM调优-方法区,堆,栈调优详解

    通常我们都知道在堆空间新生代Eden区满了,会触发minor GC, 在老年代满了会触发full GC, 触发full GC会导致Stop The World, 那你们知道还有一个区域满了一会触发Fu ...

  4. Java调优经验谈

    对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题到底出在哪里.此时就 ...

  5. [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出

    在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...

  6. Java调优之jvm和线程的内存分析

    本文来源于铁木箱子的博客http://www.mzone.cc 这几天因为自己开发的一个网站在768M内存的机器上撑不起100多个用户的运行,因为每个用户启用功能后,系统将为每个用户分配8个左右的独立 ...

  7. java中的内存空间 堆和栈

        认识堆与栈 栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过 ...

  8. Java 中的 JVM、堆和栈 -- 初步了解

    JVM -- Java Virtual Machine(Java虚拟机) —— 因为要说堆和栈,所以我们必须要先简单的说一下JVM.(JVM详细请找度娘啦~) 首先,我们都知道 java 一直宣传的口 ...

  9. 记一次Java调优案例分析

    上周,一同学给我发来,他们那里的案例 一看就是新生代产生过多对象,肯定是批量或者循环操作导致的,导致新生代一直在进行回收导致. 如果是老生代出现这样的问题,大部分情况下是列表或者集合导致的. 因此我们 ...

随机推荐

  1. python Eve RESTFul 尝试笔记

    0.前言 最近重点研究了yeelink平台的原理和使用,yeelink平台和多数云平台设计一样应用了RESTFul框架.嵌入式侧(或者是客服端侧)的相关技术研究的比较充分(个人这么认为),是不是该弄弄 ...

  2. Java Web开发常见问题

    一.Tomcat服务器常见启动问题:(1).Java_home环境变量,由于tomcat服务器的bin目录中的一些jar文件必须使用到java类库,所以必须先配置Java_home环境变量.(2).端 ...

  3. Android 自定义View (三) 圆环交替 等待效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24500107 一个朋友今天有这么个需求(下图),我觉得那自定义View来做还是很 ...

  4. Windows API一日一练(55)FlushFileBuffers和SetFilePointer函数

    在PC硬件体系结构里,速度最快的存储器是CPU里面的寄存器,接着到二级缓存,再到系统RAM内存,最后才到硬盘.因为这种体系结构,就决定了操作系统对文件的操作方式,或者说是最优化的算法.比方操作系统接收 ...

  5. Dijkstra算法and Floyd算法 HDU 1874 畅通工程续

    Dijkstra算法描述起来比较容易:它是求单源最短路径的,也就是求某一个点到其他各个点的最短路径,大体思想和prim算法差不多,有个数组dis,用来保存源点到其它各个点的距离,刚开始很好办,只需要把 ...

  6. mybatis 自动生成xml文件配置

    http://blog.csdn.net/techbirds_bao/article/details/9233599/

  7. Vitamio 多媒体框架 介绍

    功能 Vitamio 是一款 Android 与 iOS 平台上的全能多媒体开发框架,全面支持硬件解码与 GPU 渲染.Vitamio 凭借其简洁易用的 API 接口赢得了全球众多开发者的青睐.到目前 ...

  8. spring05配置文件之间的关系

    一:配置文件包含关系 1.创建对应的实体类 public class Student { //学生实体类 private String name; //姓名 private Integer age; ...

  9. java的final变量理解

    java的final变量理解 final基本类型是数值不能改变 final对象是引用不能改变,对象其自身是可以被修改的.

  10. CSS 样式属性锦集

    ul#nav > Li 只有一个大于号,是指应用了#nav这个ID的下一级元素的儿子辈Li 元素定义的内容符合这个CSS代码定义的样式,但是孙子辈Li元素定义的内容就不符合这个CSS代码样式了, ...