02-内存模型深度剖析

9 篇文章 0 订阅
3 篇文章 0 订阅

JDK体系结构

在这里插入图片描述
其实这个图的话,我觉得要讲的东西很多,但是又不知道怎么讲,因为每一个JAVA程序员入门的时候,应该都会看到这个图。
首先说一下
他们之间的关系吧。
JDK>JRE>JVM(>的意思是包含的关系)

  • JDK就是包括我们的java运行环境,还有java的一些api和工具。如果要编写java代码,就得安装JDK
  • JRE就是我们运行java代码的环境
  • JVM就是由c++创建的一个虚拟机,用来执行我们的java编译后的代码,这个就是java跨平台的主要原因

Java语言的跨平台特性

在这里插入图片描述
其实从这个已经很清楚的可以看到,JAVA跨平台,主要就是JVM的功劳,不同的操作系统会创建不同的JVM,而我们的代码都是通过JVM去执行的,那么它就是跨平台的主要原因。

JVM整体结构及内存模型

首先根据自己知道的知识,认真的看一下这个图,此图显示的是jvm的内存模型,它和java的内存模型不是一个东西,java的内存模型是JMM,后期会写到
在这里插入图片描述
一个JVM包括了三大部分:

  • 类装载系统

  • 运行时数据区(内存模型)

  • 字节码执行引擎
    在这里,主要说一下JVM的内存模型

  • 本地方法栈:它主要实现的是java底层的一些方法,比如说线程的start方法,前期使用了通过JAVA去调用别的语言,比如说C或者C++的一些方法,现在程序员一般都不会动或者修改这些方法,作为了解就可以。

  • 栈: 每一个方法执行的时候都会创建一个栈帧,如上图所示,每一个栈帧里面包含四个:局部变量表,操作数栈,动态链接,方法出口。
    操作数栈就和它的名字一样,是用来操作的,比如有一个变量a=1;b=2;
    执行a+b=3;那么首先通过操作数栈进行相加,把结果3放入局部变量表给了一个c=3;与之对应。
    动态链接就是比如有一个静态变量,这个静态变量是一个对象,对象大多数是存在堆里面的,而动态连接里面存放的就是堆里面对应的对象的地址。
    方法出口就是每一个方法执行完毕都会进行下一行代码。

  • :主要用来存放对象的地方,里面又分为年轻代和老年代。
    年轻代里面又分为Eden和s0,s1。
    此处会经常发生GC,年轻代发生的叫做minor GC也就是YGC,而老年一般发生的就是FGC,发生OOM的时候,主要就是年轻代和老年代出现了问题,后期会讲到怎么去处理以及各种垃圾回收算法。

  • 方法区:主要存放一些常量,静态变量和一些类的信息。

  • 程序计数器: 它的作用主要就是为了解决cpu调度的问题。

元空间的JVM参数有两个:

-XX:MaxMetaspaceSize: 设置元空间最大值, 默认是-1, 即不限制, 或者说只受限于本地内存大小。

-XX:MetaspaceSize: 指定元空间触发Fullgc的初始阈值(元空间无固定初始大小), 以字节为单位,默认是21M,达到该值就会触发 full gc进行类型卸载, 同时收集器会对该值进行调整: 如果释放了大量的空间, 就适当降低该值; 如果释放了很少的空间, 那么在不超 过-XX:MaxMetaspaceSize(如果设置了的话) 的情况下, 适当提高该值。这个跟早期jdk版本的-XX:PermSize参数意思不一样。
由于调整元空间的大小需要Full GC,这是非常昂贵的操作,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生 了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大, 对于8G物理内存的机器来说,一般我会将这两个值都设置为256M。

java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eurek a‐server.jar

好了,下期见。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值