jvm内存模型深度剖析

java语言跨平台性

HellowWorld.java -------------javac-------> HellowWorld.class -------------java------------->JVM(从软件层次屏蔽了不同操作系统在底层与命令的区别)-------widows(linux)

java语言代码写一次不需要修改,就可以在不同系统平台上运行。

JVM整体结构以及内存模型

在这里插入图片描述

jvm存在三个子系统: 类装载子系统,运行时数据区,字节码执行引擎
其中,类装载子系统 负责将字节码加载到JVM中,具体是加载运行时数据区的方法区中。
运行时数据区又分为 堆,栈(线程),方法区,本地方法栈和程序计数器。主要用于存储程序运行中生成的对象。
执行引擎包括解释器,即时编译器,垃圾回收器,主要用来解释执行字节码,并进行垃圾回收。

JVM运行时数据区各个区域的作用

  1. 里存放new产生的对象。年轻代和老年代。 一般3:7。 年轻代又分为 Eden(8),S1(1),S2(2)。Eden满会触发Minor GC,存活的对象进入S1(S2)区,进行一次GC年龄加1,达到15,对象还存活,进入老年代。老年代中大多存放的是:缓存对象,spring容器对象,静态变量等。老年代满,会触发full GC,回收整个堆,方法区。如果满,导致OOM。 特别是full GC,会触发STW机制(STOP THE WORLD),导致程序短暂卡顿,避免full GC频繁使用。
  2. 比如一个程序main线程,test方法线程,每个线程中都包含 局部变量表,操作数栈,动态链接,方法出口
  3. 方法区 类加载器,常量,静态变量
  4. 本地方法栈 java执行本地方法服务,c++实现(跨语言调用)。例如:new Thread().start();
  5. 程序计数器 程序执行字节码的行号指示器。(每个线程程序执行到哪行啦)。

一个方法对应一块栈帧内存空间。
对于单个线程,栈,本地方法栈,程序计数器都是独有的。生成一个线程都会分别生成一个。堆和方法区是共有的。

JVM内存参数设置

-Xms -Xmx 新生代-Xmn
-Xss (单个线程)
方法区 -XX:MetaSpaceSize -XX:MaxMetaSpaceSize

SpringBoot 程序JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件中)

java  -Xms 2048M -Xmx 2048M -Xmn 1024M   -Xss512K -XX:MetaSpaceSize=256M  -XX:MaxMetaSpaceSize=256M  -jar  ***.jar

jdk8开始,方法区为元空间,存在于本地内存中,一定要设置初始值和最大值。初始值一开始默认21M,进行垃圾回收,会根据回收大小,例如回收1M,有可能扩容为30M,回收15M,缩小容量为10M,有可能回收少,经过多次垃圾回收,将自己的磁盘占满,造成sof.

总结:一般情况下堆,方法区,栈都需要设置默认值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值