超详细的JVM优化方案

本文详细探讨了JVM中的堆栈概念,解释了为何需要堆和栈,以及它们如何协同工作。强调了栈中存储基本数据类型和对象引用,而堆用于存储对象。讨论了参数传递、对象大小、引用类型及其在垃圾回收中的角色。文章还介绍了多种垃圾回收算法,如标记-清除、复制和标记-整理,以及分代收集策略,重点关注年轻代、老年代和持久代。最后,文章阐述了垃圾回收的启动条件和如何避免长时间暂停问题。
摘要由CSDN通过智能技术生成

一.概念理解
1.1堆与栈

栈是运行时单位,解决程序的运行问题,即程序如何执行,或说如何处理数据
堆是数据的存储单位,堆是jvm中管理内存中最大一块。它是被共享,存放对象实例。也称为“gc堆”。
垃圾回收的主要管理区域

在java中一个线程就会有一个线程栈与之对应,不同的线程执行逻辑不同,因此需要一个独立的线程栈。而堆是所有线程共性的。栈因为是运行单位,因此里面存储的信息都是跟当前线程相关信息的。包括局部变量,程序运行状态,方法返回值等等;而堆只负责存储信息。
在这里插入图片描述
1.2为什么需要堆和栈
第一.从设计角度,栈代表了处理逻辑,而堆代表了数据。这样分开,使得逻辑更为清晰。分而治之的思想。这种隔离。模块化的思想在设计的方方面面都有体现。
第二.堆与栈的分离,使得堆中的内容可以被多个栈共享(也可以理解为多个线程访问同一个对象)。这种共享的收益很多,一方面这种共享提供了一种有效的数据交互方式,另一方面,堆中的共享变量和缓存可以被所有栈访问,节省空间
在这里插入图片描述第三.栈因为运行时需要,比如保存形系统运行的上下文,需要进行地段的划分。由于栈只能向上增长,因此就会限制栈储存内容的能力。而堆不同,堆中的对象可以根据需要动态增长的。因此栈和堆拆分,使得动态增长成为可能,相应栈中只需要记录堆中的一个地址即可。
第四.面向对象就是堆与栈的完美结合。我们把对象开分开,对象的属性其实就是数据,存放在堆中;而对象的行为(运行逻辑),放在栈中。我们在编写对象的时候,其实是编写了数据结构,也编写的数据处理的逻辑。在java中,Main函数是栈的起始点,也是程序的起始点

1.3存储数据
堆中存的是对象
栈中存储的是基本数据类型和堆中对象的引用
一个对象的大小是不可估计的,或者说是动态变化的,但是栈中,一个对象只对应了一个4byte的引用
为什么不把基本类型放在堆中呢?
**因为其占用的空间一般是1~8个字节,需要空间比较少,因为是基本类型,不会出现动态增长的的情况(长度固定),因此在栈中存储就足够了。**如果把它存在在堆中是没有意义的(还会浪费空间)。可以这么说,基本类型和对象的引用都是存在在栈中,但是基本类型,对象引用和对象本身就有区别了,因为一个是栈中的数据,一个是堆中的数据,会产生java中参数传递的问题

三.参数传递
1.java中只有值传递(基本数据类型的值,引用数据类型的值)
2.java中没有指针的概念
3.程序运行永远是在栈中进行的,因此参数传递时,只存在传递基本类型和对象引用的问题。不会传对象本身。堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。正因为堆和栈分离的思想,才使得java的垃圾回收称为可能。

java中,栈的大小通过-Xss来设置,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。常见的出现这个异常是无法返回的递归,因为栈中保存的信息都是方法返回的记录点。

四.对象的大小
在stack里面,对象的大小:4byte的引用
基本数据的类型的大小是固定的。对于非基本数据类型的java对象的大小,就值得商榷。

在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小,看下面语句:

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值