JVM个人阶段小结

JVM是由栈内存,和堆内存组成的。是执行方法和存储数据的空间,一个.class文件执行的时候jvm 会将代码的各个区域拆分到对应的堆内存和栈内存中。
栈内存中存储的是基本数据类型和引用变量名即堆中的地址(占四个字节),还有局部变量(包含定义的基本数据类型入int a=10 ,引用变量名如String s)。堆中存储的是引用类型的数据(new),常量(final),静态变量(static),成员变量(定义在最外面的全局变量作用于整个类)。栈内存包含三大部分:程序计数器,虚拟机栈,本地方法栈。堆内存包含两大块区域:堆,方法区。方法区也就永久代,存储的是常量,静态变量,堆存储的是成员变量还有new的对象。
在栈内存中一个程序执行的起始点是main方法,线程运行方法是从栈内存中开始的,程序计数器:是记录当前线程(在cpu上)正在执行的字节码指令的地址 行号,虚拟机栈:存储当前 线程运行方法 所需要的数据(存储在局部变量表中的局部变量),指令(存储在操作数栈中的方法),返回地址(存储在出口中)(遵循先进后出,处理的是一个个的方法),本地方法区:当这个方法是native方法时会跳跃虚拟机栈在本地方法栈中执行。这是在栈中执行所有的方法,当需要用到数据的时候,则需要从公共区堆中提出即可完成一个方法的运行。
在这里插入图片描述
虚拟机栈
虚拟机栈中的单位是栈帧,一个栈帧包含至少四个部分:每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。在编译代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈 都已经完全确定了,并且写入到了方法表的Code属性中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体虚拟机的实现。
栈帧
局部变量表:存储局部变量值
操作数栈:处理局部变量中的方法(宽度为32位)
动态链接:调用时用
出口:返回
在这里插入图片描述

堆中存储方式
堆内存的存储的结构可以分为以下,在JDK1.8以前永久代属于方法区,在1.8之后就不属于了。JVM的内存模型分为新生代,老年代,永久代。先新生代:老年代 = 1:2的内存比例。新生代中包含三个区域,eden,from,to单个区域,所占的内存比例为8:1:1。
新内存存储机制以及GC回收机制:
产生的新的内存一般都是先分给新生代的eden区,当eden区内存满的时候触发第一次GC回收,将可以回收的内存回收掉。经过N次的GC回收之后,当内存满了之后会自动将不能回收的内存分配到s0区域,s0区域内存满的时候也是经过M次回收之后,将剩下不能被回收的内存放到s1区,s1区同样经过X次垃圾回收之后,将不能回收的内存放到老年代,老年代经过很多次回收之后,将不能被回收的内存放到永久代。或者第一次内存内存分配的时候超过了新生代内存信息存储的最大值的时候 ,自动分配给老年代来处理。
在这里插入图片描述

小结:
栈内存:栈内存存的内存管理 定长,按照顺序分配不存在内存回收。 堆内存:不定长可动态增长 ,需要GC回收内存
存储的是方法(四个字节的地址) 存储的是属性
存储引用变量名,引用变量在程序运行作用域外释放 new的方法和数组,当栈中无引用变量指向的时不确定时间被GC回收
main方法是程序的起点,也是栈的起点
栈内存是程序运行的根本的东西,可以无堆内存,但是不能没有栈内存。

内存溢出(栈溢出):指的是在虚拟机栈中创建的栈帧的深度超出了虚拟机栈的深度,导致溢出,一般都是递归造成的
如何解决:我们需要使用参数 -Xss 去调整JVM栈的大小
在这里插入图片描述

内存泄漏(堆溢出):堆空间,堆中主要存储的是对象。如果不断的new对象则会导致堆中的空间溢出
如何解决:可以通过 -Xmx4096M 调整堆的总大小
在这里插入图片描述

永久代溢出:由于JDK7、8移除永久带,所以上述代码在JDK1.6的情况中会出现永久带溢出的现象。
参考:https://blog.csdn.net/qq_31615049/article/details/82980799

拓展:
jdk,jre,jvm之间的关系和作用:
在这里插入图片描述在这里插入图片描述

问答
为什么JAVA能够火起来(你怎么看待JAVA)?
答案:JAVA通过JVM自动给分配内存,自动回收垃圾,很方便,我们只需要关注业务逻辑就可以了。

Java中的参数传递时传值呢?还是传引用?
答:是值传递。Java 语言的参数传递只有值传递。当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。

JVM内存模型JMM的优点?
1.增强空间利用率(当新生代跟老年代的内存存储满的时候进行释放内存)。
2. 方便GC回收

JVM最小的执行单位是什么?
答案:线程

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值