java调优随记-堆和栈
基础知识:
关于堆和栈,堆和栈是程序运行的关键,关于堆和栈的定义和解释可自行搜索,我比较认可以程序运行过程中他们扮演的角色作为对比的点:堆是存储的单位,而栈是程序运行时的单位。栈解决的是程序的运行问题,即程序如何运行,如何处理数据。堆解决的是存储问题,即数据存储在哪里,怎么存储。
程序中每启动一个线程就有一个栈与之对应。因为每个线程执行的逻辑不同,所以需要独立的栈来描线程如何运行。而堆是所有线程共享的。
栈之所以是运行时单位,主要是因为栈中保存的都是当前线程中,包括局部变量,程序运行状态和方法返回值。而堆用来存储对象信息。
堆和栈的关系:
1.从软件设计的角度看,栈代表了处理逻辑,堆代表了数据。这样分开使得处理逻辑更加清晰。分而治之的思想体现。
2.栈与堆的分离,使堆中的数据被多个栈共享。栈的存取速度相当快,仅次于cpu中的寄存器,但是栈的大小是有限制的,不可能过多地存储数据,堆的出现则解决了这个问题,堆中的数据可以被多个栈共享,节约了栈的空间。另外也为数据的交换提供了一种方案。
3.栈是运行时单位,也就是随着程序运行,程序进行系统上下文切换时都需要对地址段进行划分,由于栈是向上增长的,就会限制栈存储内容的能力。而堆可以动态增长,栈只要记录一下堆中的地址。
4.面向对象就是堆和栈的优势互补。面向对象程序和结构化程序的运行基本是一样,只是面向对象的思考方式更接近自然思考的方式。比如java中的一个类的对象,对象的属性就是数据,对象的方法就是逻辑。属性保存在堆里,而方法保存在栈中。
堆中存储对象,栈中存储的是基本数据类型和对象引用。
java中传递参数到底是值传递还是引用传递呢?
java中没有指针的概念,程序永远是在栈中运行的,因此在参数传递的时候,只能是值传递,即传递基本数据类型和对象引用,不会直接传递对象。
基本数据类型的传递和对象引用的传递都是传值。
堆和栈中,栈是程序运行的最根本的东西。程序可以没有堆,但是不能没有栈。堆是为栈服务的,堆里存储的数据,就是用来被所有的栈共享的。
在java中,可以通过-Xss来设置栈的大小。如果栈中存储的数据过多,就会报出java.lang.StackOverflowError。所以在部署线上应用前,请根据实际情形适当调整栈大小。
java调优随记-堆和栈的更多相关文章
- java调优随记-java对象大小
在java中,基本数据类型的大小是固定.但是java对象的大小是不固定的,需要通过计算. 在java中,一个空对象(没有属性和方法的对象)在堆中占用8byte,比如 Object obj = new ...
- Java调优
Java调优经验谈 对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题 ...
- 7.JVM调优-方法区,堆,栈调优详解
通常我们都知道在堆空间新生代Eden区满了,会触发minor GC, 在老年代满了会触发full GC, 触发full GC会导致Stop The World, 那你们知道还有一个区域满了一会触发Fu ...
- Java调优经验谈
对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题到底出在哪里.此时就 ...
- [JVM教程与调优] 了解JVM 堆内存溢出以及非堆内存溢出
在上一章中我们介绍了JVM运行时参数以及jstat指令相关内容:[JVM教程与调优] 什么是JVM运行时参数?.下面我们来介绍一下jmap+MAT内存溢出. 首先我们来介绍一下下JVM的内存结构. J ...
- Java调优之jvm和线程的内存分析
本文来源于铁木箱子的博客http://www.mzone.cc 这几天因为自己开发的一个网站在768M内存的机器上撑不起100多个用户的运行,因为每个用户启用功能后,系统将为每个用户分配8个左右的独立 ...
- java中的内存空间 堆和栈
认识堆与栈 栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过 ...
- Java 中的 JVM、堆和栈 -- 初步了解
JVM -- Java Virtual Machine(Java虚拟机) —— 因为要说堆和栈,所以我们必须要先简单的说一下JVM.(JVM详细请找度娘啦~) 首先,我们都知道 java 一直宣传的口 ...
- 记一次Java调优案例分析
上周,一同学给我发来,他们那里的案例 一看就是新生代产生过多对象,肯定是批量或者循环操作导致的,导致新生代一直在进行回收导致. 如果是老生代出现这样的问题,大部分情况下是列表或者集合导致的. 因此我们 ...
随机推荐
- Swift开发语法
Swift开发入门 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 历史 2010 年 7 月,苹果开发者 ...
- Shell脚本:判断用户和用户组是否已经存在/创建用户和用户组
通常作为一个应用程序的部署脚本,开始的第一项工作是为当前应用创建一个专用(dedicated)的用户和用户组.这个脚本很简单,这里贴一个参考样本: #!/bin/sh user=test_user ...
- [转] vim 正则表达式 很强大
毋庸多言,在vim中正则表达式得到了十分广泛的应用. 最常用的 / 和 :s 命令中,正则表达式都是不可或缺的. 下面对vim中的正则表达式的一些难点进行说明. 关于magic vim中有个magic ...
- yii cgridview 对生成的数据进行分页
这个其实最简单 在对应的model里找Search方法 找到后,参见如下代码 public function search() { // @todo Please modify the followi ...
- 一个简单的Verilog计数器模型
一个简单的Verilog计数器模型 功能说明: 向上计数 向下计数 预装载值 一.代码 1.counter代码(counter.v) module counter( input clk, input ...
- Windows Native API
http://en.wikipedia.org/wiki/Native_API Windows 的原生 API 函数通常在系统启动时(这里其他 Windows 组件还不可用).kernel32.dll ...
- -webkit-appearance改变任何元素的浏览器默认风格
前段时间,公司有个紧急发布会,需要在移动端做一个邀请函的页面.但是在实现下拉框的时候,IOS和安卓展示的效果总是不一样.经过我一番查找,偶然间发现了-webkit-appearance这个样式属性.后 ...
- 类名.this与类名.class
1..当在内部类中使用this指的就是内部类的对象, 为了访问外层类对象,就可以使用外层类名.this来访问. 2.在java中,每个class都有一个相应的Class对象,当编写好一个类,编译完成后 ...
- 华为S5300交换机配置基于VLAN的本地端口镜像
配置思路 1. 将Ethernet0/0/20接口配置为观察端口(监控端口) 2. 将VLAN 1.11.12.13.14配置为镜像VLAN 配置步骤 1. 配置观察端口 <Switch& ...
- Windows 下 SVN 服务器配置
1.下载文件, 下载最新版本subversion,我这里选择VisualSVN-Server-2.5.7.exe 2.安装Subversion 服务器 由于我下载的是setup.exe版本 ...