基础知识:

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

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

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

堆和栈的关系:

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. HDU1257:最少拦截系统(LIS)

    Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高 ...

  2. Microsoft Dynamics CRM4.0编程---说明

    Introduction(说明) If your organization has customers, you need a software system to help you manage y ...

  3. SKScene类

    继承自 SKEffectNode:SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) ...

  4. LaTex希腊字母

    Name Symbol Command Alpha $\alpha$ $A$ \alpha A Beta $\beta$ $B$ \beta B Gamma $\gamma$ $\Gamma$ \ga ...

  5. [Angular 2] Dispatching Action with Payloads and type to Reducers

    While action types allow you tell your reducer what action it should take, the payload is the data t ...

  6. oracle中split的使用

    1.创建自己的类型 VARCHAR2ARRAY CREATE OR REPLACE TYPE "VARCHAR2ARRAY" as table of varchar2(300); ...

  7. ASSERT_VALID和ASSERT宏分析

    这个宏都是MFC的调试宏. ASSERT_VALID宏用来在运行时检查一个对象的内部合法性,比如说现在有一个学生对象,我们知道每个学生的年龄一定大于零,若年龄小于零,则该学生对象肯定有问题. 事实上, ...

  8. session过期后自动跳转到登陆页

    项目需要做一个自动登出的功能,查询了网上的资料,一开始准备用session监听做,按照下面方式配置监听器 1.在项目的web.xml文件中添加如下代码: <!--添加Session监听器--&g ...

  9. MySQL-视频跟随练习笔记

    在表中添加某列 alter table tbl_user add email varchar(50); 在表中删除某列 alter table tbl_user drop email; 重命名某列 a ...

  10. sql循环遍历

    <sql id="Example_Where_Clause" > <!-- WARNING - @mbggenerated This element is aut ...