系统运维系列之堆栈理解(java应用)(代码片段)

琅晓琳 琅晓琳     2022-12-13     282

关键词:

1 概述
java虚拟机内存分为:堆(heap)、栈(stack)、方法区(method area)等,整体来说:
堆:new出来的数组或者对象;
栈:存储局部变量;
方法区:代码区;
寄存器:给CPU使用。

2 详细介绍
堆:存放创建好的对象和数组(数组也是对象,new出来的对象存放在堆中),JVM中只有一个堆空间,它被所有线程共享;堆是一个不连续的内存空间,分配灵活,速度慢;
栈:方法执行的内存模型(属于线程私有,不属于线程共享),先进后出,后进先出,栈存储局部变量。栈由系统自动分配,速度快,栈是一个连续的内存空间;
方法区:(静态区),jvm只有一个方法区,被所有线程所共享,方法区其实也是堆,只是用于存储 类、常量相关的信息。

3 static、final修饰符、内部类和Java内存分配
static修饰符:static修饰符能够与属性、方法和内部类一起使用,表示静态的。类中的静态变量和静态方法能够与类名一起使用,不需要创建一个类的对象来访问该类的静态成员,所以,static修饰的变量又称作“类变量”。一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间;
final修饰符:在Java声明类、属性和方法时,可以使用关键字final来修饰,final所标记的成分具有终态的特征,final标记的类不能被继承,final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次,final一般用于标记那些通用性的功能、实现方式或取值不能随意被改变的成分;
内部类:内部类可以体现逻辑上的从属关系,同时对于其它类可以控制内部类对外不可见等,内部类可以直接访问外部类的成员,可以用此实现多继承。

4 生命周期管理
栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失;
堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。

5 举例
字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

//s1~s3均指向常量区,只有一份
String s1 = "AAA";  
String s2 = "AAA";  
String s3 = "AAA";  
//s4~s6是new出来的,存在堆区,有三份,常量池中只有一份
String s4 = new String("AAA");  
String s5 = new String("AAA");  
String s6 = new String("AAA");  

基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
成员变量和局部变量:成员变量就是方法外部,类的内部定义的变量;局部变量就是方法或语句块内部定义的变量。局部变量必须初始化,局部变量的数据存在于内存中,栈内存中的局部变量随着方法的消失而消失。成员变量存储在中的对象里面,由垃圾回收器负责回收。

6 在JVM栈这个数据区可能会发生抛出两种错误
StackOverflowError 出现在栈内存设置成固定值的时候,当程序执行需要的栈内存超过设定的固定值会抛出这个错误;
OutOfMemoryError 出现在栈内存设置成动态增长的时候,当JVM尝试申请的内存大小超过了其可用内存时会抛出这个错误。

7 总结

参考资料:
https://blog.csdn.net/dyy0920/article/details/83654083 java中的堆栈
https://www.cnblogs.com/ffaiss/p/10681734.html java中堆栈(stack)和堆(heap)
https://blog.csdn.net/cx1110162/article/details/89705881 JAVA堆栈
https://www.zhihu.com/question/29833675 Java虚拟机的堆、栈、堆栈如何去理解?

系统运维系列之mysql部分学习整理5(代码片段)

1应用场景在mysql数据库中查找数据,要求是数据为日期不连续数据,输入一个日期查询日期所在周指定周几的数据和上几周对应时间段数据(一个月内)。关于此问题网上资料未曾有明确的解决方案,本篇博... 查看详情

系统运维系列之异常抛出后代码执行问题(java应用)

1问题描述thrownewExcpetion()之后,程序并没有向下继续运行,抛出异常后直接跳出,后面的功能不再执行。//抛出异常:Exceptioninthread"main"java.lang.NumberFormatException//不会执行后面的输出语句publicstaticvoidmain(String[]args) S... 查看详情

自动化运维系列之ansible命令应用基础(模块的应用)持续更新中···(代码片段)

自动化运维系列之Ansible命令应用基础(模块的应用)模块简介Ansible可以使用命令行方式进行自动化管理,基本语法如下:ansible<host-pattern>[-mmodule_name][-aargs]<host-pattern>对哪些主机生效[-mmodule_name]需要使用的模块[-aargs]模块... 查看详情

系统运维系列之greenplumvacuum清理删除数据命令(代码片段)

...m完成清理工作后,那些空间并没有真正被释放给操作系统,只能被vacuum清理过的表和索引所利用 查看详情

系统运维系列之socket和serversocket的简单介绍(java应用)

Socket类代表一个客户端套接字,即任何时候连接到一个远程服务器应用时构建所需的socket。现在,要实现一个服务器应用,需要不同的做法。服务器需随时待命,因为不知道客户端什么时候会发来请求,此时&#... 查看详情

系统运维系列之linux系统下常用查找命令整理(代码片段)

1前言网上关于linux命令大多写的很细很全,但是真正使用起来需要根据自己的场景进行拼接,本博客建立在实际场景下,在实际问题中使用linux查找命令。2grep命令使用场景:查找日志中的关键词,并且限定时... 查看详情

系统运维系列之mysql联合索引的使用分析(代码片段)

1前言日常优化中可能会遇到相同的数据在本地执行很快但是在服务器上执行很慢的问题,或者无论是在本地还是在服务器上都执行的很慢,可以分为两个方面排查2第一部分本地执行速度>服务器执行速度一般这种情况... 查看详情

系统运维系列之ip地址和子网划分介绍(代码片段)

1简介接上一篇博客:关于A类,B类,C类IP地址的网段和主机数的计算方法2详细内容(1)子网掩码IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相同的主... 查看详情

系统运维系列之kafka手动设置offset(经典方法总结)(代码片段)

1问题背景在使用Kafka消费数据过程中,消费程序可能出现运行问题,导致消费不及时,消息堆积很多;尤其是消息消费后需要进行一列后处理,这种情况下就需要考虑一些方法来进行消费参数的设置。2举例测... 查看详情

系统运维系列之clickhouse数据库学习集锦(增删改查操作)(代码片段)

1简介本篇内容涉及一些增删改查操作,包括数据库、表,重点介绍字段的增加/删除操作,其中包含的内容均实际测试通过。2Clickhouseclickhouse是一款MPP架构的列式存储数据库,它拥有完备的管理功能,所以它称... 查看详情

系统运维系列之java中需要转义的特殊字符(代码片段)

在Java中,不管是String.split(),还是正则表达式,有一些特殊字符需要转义,这些字符是:([/^-$¦])?*+.转义方法为字符前面加上"\\",这样在split、replaceAll时则不会报错;//replace和replaceAll区别࿱... 查看详情

系统运维系列之记载一次windows系统下tomcat启动报错的问题(代码片段)

1问题简介最近遇到一个问题,在windows系统下部署tomcat项目,cmd命令启动时频繁报错,比如Unsupportedmajor.minorversion52.0,且cmd界面上打印出来的日志为乱码;最后在关闭tomcat时发现关不掉,出现项目挂起但是... 查看详情

系统运维系列之java中实现多线程的方式补充

1介绍接本专题博客之系统运维系列之java中实现多线程的方式上篇博客提到多线程使用的4种方式,分别是:实现方式1:继承Thread类,重写该类的run方法;实现方式2:实现Runnable接口,并重写该接口的run... 查看详情

自动化运维系列之ansible的简介与安装持续更新···(代码片段)

自动化运维系列之Ansible的简介与安装自动化运维工具简介由于互联网的快速发展导致产品更新换代的速度逐渐加快,这就导致运维人员的日常工作会大大增加,如果还是按照传统方式进行维护工作会使工作效率低下。此时,就... 查看详情

系统运维系列之mysql部分学习整理2

1字符函数使用举例:CONCAT_WS相比于CONCAT可以简化语句SELECTCONCAT(id,’-’,age)ASpathFROMuser;SELECTCONCAT_WS(’-’,id,age)ASpathFROMuser;SELECTFORMAT(id,3)ASnumFROMuser;SELECTLEFT(‘abcdef’,2);—>ab举例:SELECT 查看详情

系统运维系列之clickhouse数据类型整理

Clickhouse支持的数据类型在system.data_type_families表中检查数据类型名称以及是否区分大小写,这个表中存储了ClickHouse支持的所有数据类型。select*fromsystem.data_type_familieslimit10;Int说明ClickHouse中整形分为Int8、Int16、Int32、Int64来表示... 查看详情

系统运维系列之mysql部分学习整理3

1存储过程语法结构:举例:无参CREATEPROCEDUREsql()SELECTVERSION();调用:CALLsql();有参IN:DELIMITER//(更改执行符号的命令)参数与语句中的字段不要重复,不要重复!如果p_id改成id,则会全部删除࿰... 查看详情

系统运维系列之mysql部分学习整理4

1存储引擎查看数据库表创建命令:SHOWCREATETABLEtab1;支持的存储引擎:MylSAM:快速存储;InnoDB:带有事务回滚机制;MemorycsvArchive修改存储引擎的方式:通过修改MySQL配置文件实现default-storage-engine=engine... 查看详情