JVM内存模型详解

简介: Survivor区中有两个相同大小的区域,为S0和S1区,当Eden区满了的话,会进行Minor Gc,将存活的对象放入到S0中,然后将Eden区中的垃圾对象全部清理,当Eden中又满了的话,会将Eden中存活的对象和S0中存活的对象一起放入S1中,依次类推。当存活次数达到15次,对象就会被放入到老年代中。

一、JVM内存模型



1、JVM虚拟机


1.1、虚拟机栈


存放局部变量


栈帧:


1.局部变量表:存放局部变量。


2.操作数栈:数据在计算过程中需要一块中转内存空间用来存放,就是操作数栈。


3.动态链接:在程序运行过程中,将符号引用变为直接地址引用。


4.方法出口:指向调用该方法的其它方法。例如A方法第三行调用B方法,那么B方法的方法出口指向A方法的第四行。


1.2、本地方法栈


运行native本地方法。调用c语言编写的代码。


1.3、堆


new一个对象就会放到堆中


1.4、方法区


常量,静态变量,类信息


1.5、程序计数器


存放当前线程运行到哪行代码的行号,为了是如果此时cpu去运行别的线程后再返回来的时候可以知道之前运行到哪里了,可以接着运行。


2、堆详解


2.1、年轻代-Eden区


新new的对象会先放入Eden区中。


2.2、年轻代-Survivor区


Survivor区中有两个相同大小的区域,为S0和S1区,当Eden区满了的话,会进行Minor Gc,将存活的对象放入到S0中,然后将Eden区中的垃圾对象全部清理,当Eden中又满了的话,会将Eden中存活的对象和S0中存活的对象一起放入S1中,依次类推。当存活次数达到15次,对象就会被放入到老年代中。


2.3、老年代


对象在年轻代存活15次后会被放入老年代中。当老年代放满了后会进行Full Gc。


二、STW



1、停止用户线程


1.1、停止用户线程


在进行Minor Gc或者Full Gc的时候会停止用户线程,用户会感觉到卡顿。Full Gc卡顿比Minor Gc更严重,所有我们要避免程序经常Full Gc。


三、方法区详解



1、方法区容量动态伸缩


1.1、默认初始


方法区默认初始值为21M,当方法区满了的话也会触发Full Gc,所以我们一般会手动设置方法区的容量,设置方法区的初始值和最大值命令: -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256


四、线程栈空间设置



1、线程栈空间设置


1.1、含义


线程栈是我们每一个线程中栈的总大小,默认为1M,可以通过命令修改:-Xss128k

结论:-Xss设置的越小一个线程的栈空间越少,但是能创建的线程数就会越多。


相关文章
|
7天前
|
存储 算法 Java
JVM自动内存管理之垃圾收集算法
文章概述了JVM内存管理和垃圾收集的基本概念,提供一个关于JVM内存管理和垃圾收集的基础理解框架。
JVM自动内存管理之垃圾收集算法
|
7天前
|
存储 Java 程序员
JVM自动内存管理之运行时内存区
这篇文章详细解释了JVM运行时数据区的各个组成部分及其作用,有助于理解Java程序运行时的内存布局和管理机制。
JVM自动内存管理之运行时内存区
|
19天前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
1天前
|
Java Docker 索引
记录一次索引未建立、继而引发一系列的问题、包含索引创建失败、虚拟机中JVM虚拟机内存满的情况
这篇文章记录了作者在分布式微服务项目中遇到的一系列问题,起因是商品服务检索接口测试失败,原因是Elasticsearch索引未找到。文章详细描述了解决过程中遇到的几个关键问题:分词器的安装、Elasticsearch内存溢出的处理,以及最终成功创建`gulimall_product`索引的步骤。作者还分享了使用Postman测试接口的经历,并强调了问题解决过程中遇到的挑战和所花费的时间。
|
6天前
|
存储 安全 Java
JVM内存结构
这篇文章详细介绍了Java虚拟机(JVM)的内存结构,包括类的加载过程、类加载器的双亲委派机制、沙箱安全机制、程序计数器、Java栈、Java堆、本地方法和本地方法栈等关键组件及其作用。
JVM内存结构
|
21天前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
|
21天前
|
存储 缓存 算法
(五)JVM成神路之对象内存布局、分配过程、从生至死历程、强弱软虚引用全面剖析
在上篇文章中曾详细谈到了JVM的内存区域,其中也曾提及了:Java程序运行过程中,绝大部分创建的对象都会被分配在堆空间内。而本篇文章则会站在对象实例的角度,阐述一个Java对象从生到死的历程、Java对象在内存中的布局以及对象引用类型。
|
23天前
|
Java
Jinfo 查看 jvm 配置及使用 Jstat 查看堆内存使用与垃圾回收
Jinfo 查看 jvm 配置及使用 Jstat 查看堆内存使用与垃圾回收
29 5
|
23天前
|
Java
jmap 查看jvm内存大小并进行dump文件内存分析
jmap 查看jvm内存大小并进行dump文件内存分析
28 3
|
26天前
|
Arthas 存储 Java
JVM内存问题之Linux使用ptmalloc2导致的JNI内存溢出问题如何解决
JVM内存问题之Linux使用ptmalloc2导致的JNI内存溢出问题如何解决