java调优随记-堆和栈

基础知识:

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

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

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

堆和栈的关系:

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

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

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

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

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

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

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

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

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

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

java调优随记-堆和栈

时间: 2024-11-03 09:49:41

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

java调优随记-java对象大小

在java中,基本数据类型的大小是固定.但是java对象的大小是不固定的,需要通过计算. 在java中,一个空对象(没有属性和方法的对象)在堆中占用8byte,比如 Object obj = new Object();另外栈中存储引用需要占用4byte的空间,总共需要16byte空间(喂,为为什么不是12byte?因为java在内存分配的时候都是以8的倍数在分配).在java中所有的对象都继承Object,所以不论什么样的对象大小都不能小于8byte. 计算一下下面的对象的大小? Class O

Java调优

Java调优经验谈 对于调优这个事情来说,一般就是三个过程: 性能监控:问题没有发生,你并不知道你需要调优什么?此时需要一些系统.应用的监控工具来发现问题. 性能分析:问题已经发生,但是你并不知道问题到底出在哪里.此时就需要使用工具.经验对系统.应用进行瓶颈分析,以求定位到问题原因. 性能调优:经过上一步的分析定位到了问题所在,需要对问题进行解决,使用代码.配置等手段进行优化. Java调优也不外乎这三步. 此外,本文所讲的性能分析.调优等是抛开以下因素的: 系统底层环境:硬件.操作系统等 数据

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

这几天因为自己开发的一个网站在768M内存的机器上撑不起100多个用户的运行,因为每个用户启用功能后,系统将为每个用户分配8个左右的独立线程,我的这篇文章http://www.mzone.cc/article/311.html也有介绍的.在内存小的机器上经常出现的问题就是Cann't allocate memory和OutOfMemoryError错误,这个要从jvm的内存结构来进行分析了.在jvm内存调整过程中,我们经常使用的参数就是: -Xms 为jvm启动时分配的内存,比如-Xms200m

java 运行时内存分配 堆和栈区别

java 运行时 内存 分配 一个java进程可以包含多个线程 一个Java进程对应唯一一个JVM实例 一个JVM实例唯一对应一个堆 每一个线程有一个自己私有的栈 这儿也可以看出线程共享进程的堆, 但不共享栈 这篇文章里有一道 线程和进程面试题 堆 堆是被线程共享的 一个进程只有一个堆 堆中存放对象本身和数组本身 java 中, 数组(比如 int[]) 也是继承Object对象, 不是继承Object[] 栈 数据结构里面讲了, 栈是先入后出 栈中存放的是对象的引用(声明和引用对象是有先后顺序

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

JVM -- Java Virtual Machine(Java虚拟机) -- 因为要说堆和栈,所以我们必须要先简单的说一下JVM.(JVM详细请找度娘啦~) 首先,我们都知道 java 一直宣传的口号是:一次编译,到处运行.其实它具体的实现是因为 java 程序经过一次编译之后,将 java 代码编译为字节码也就是 class 文件,然后只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序. 所以说它是 java 的核心和基础. 个人觉得,它大概的执行过程就是:

Java调优知识汇总

查看java进程运行状况jps -lvm 查看java默认堆大小 java -XX:+PrintFlagsFinal | grep MaxHeapSize eclipse调试设置vm参数 在项目上右键,依次点击“Debug As ”-> “Debug Configurations ”,在Arguments 参数中的“VM arguments: ”中填入如下值即可. -Xms64m -Xmx128m 查看vm参数 public class TestMemory { /** * @param arg

java调优参数记录

java -server -Xms1024m -Xmx2048m -XX:+UseParallelGC -XX:+UseG1GC -XX:ParallelGCThreads=4 -XX:+UseParallelOldGC -XX:+UseAdaptiveSizePolicy -Xms:初始堆大小 -Xmx:最大堆大小 -XX:+UseParallelGC:选择垃圾收集器为并行收集器.此配置仅对年轻代有效. -XX:ParallelGCThreads=4:配置并行收集器的线程数,即:同时多少个线程

JVM快速调优手册之四: 堆内存分配的CMS公式解析

JVM 堆内存组成 Java堆由Perm区和Heap区组成,Heap区由Old区和New区(也叫Young区)组成,New区由Eden区.From区和To区(Survivor)组成. Eden区用于存放新生成的对象.Eden中的对象生命不会超过一次Minor GC.Survivor Space 有两个,存放每次垃圾回收后存活的对象,即图的S0和S1.Old Generation Old区,也称老生代,主要存放应用程序中生命周期长的存活对象 公式 将EDEN与From survivor中的存活对象

Android性能调优:记一次解决OOM的经历

OOM OOM(Out Of Memory)是Android应用开发中相信每个人都遇到过的问题,而OOM在crash log中的stack trace一般没有实际意义,因为是在分配内存的时候才会抛出OOM异常,而这个时候的stack trace和OOM的原因没有任何关系.所以OOM问题的定位和分析就需要多花费一些功夫. 下面,我就结合一个例子,来讲讲怎么定位OOM问题. 问题 在程序员们把代码写完,基本流程测试无误,准备要发布的时候,云测的结果却是:一大波OOM异常.没办法,只好重新打开电脑定位