基础知识:

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

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

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

堆和栈的关系:

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. ssh端口映射,本地转发

    应用场景: # HOSTA<-X->HOSTB 表示A,B两机器相互不可以访问,  HOSTA<-->HOSTB 表示A,B两机器可以相互访问# 1.localhost< ...

  2. 【服务器运维】Windows Server 2008 R2 下配置证书服务器和HTTPS

    前言 2017年1月1日起App Store上的所有App应用将强制开启ATS功能. 苹果的ATS(App Transport Security)对服务器硬性3点要求: ① ATS要求TLS1.2或者 ...

  3. ubuntu下libjson-c库的使用问题备忘

    首先安装libjson的c库 #apt-get install libjson0-dev libjson0 安装好后查看/usr/include/json下是否有头文件,有就对了! gcc -o ...

  4. Java线程的相关方法

    ~ start()  启动线程方法 ~ run()  调用start()方法时,真正执行的就是该方法的方法体 ~ sleep()  让当前线程睡眠,睡眠到期自动苏醒,并进入可运行状态,而不是运行状态 ...

  5. JavaScript高级编程II

         原文地址: http://www.onlamp.com/pub/a/onlamp/2007/08/23/advanced-javascript-ii.html?page=1 在前面的文章中, ...

  6. Max retries exceeded with ur

    requests模块在抓取网页时抛出ConnectionError异常,Max retries exceeded with url 主要搜下 "Caused by <class 'so ...

  7. redis 本机链接服务端命令

    在windows 本机链接服务端redis,需要下载windows 端的redis: 1,运行redis-server.exe程序:2,打开cmd 控制台3,执行命令 D:\redis64\redis ...

  8. LVM命令摘要

      命令 描述 物理卷(PV) pvcreate 创建LVM磁盘     #pvcreate /dev/sdb pvdisplay 显示卷组中的物理卷信息 pvchange 设置PV的性能,允许或拒绝 ...

  9. mongodb查询之模糊查询

    mongodb的模糊查询是用正则表达式来实现的.例子如下: db.COMMODITY_COMMODITY_SHOP.find({name:{$regex :/南京/i}})

  10. asp.net 连接oracle,报错误“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本

    1.http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 下载对用版本的Instan ...