Java虚拟机(JVM)

内存模型和参数调优

javac编译原理是什么

跨平台,鱼和熊掌不可兼得。

java虚拟机的内部组成:

堆:new的对象都是在堆上。

栈(线程):放局部变量的。栈帧。符合后进先出的性质。

字节码文件

javap

JVM指令手册(Orcle官方网站):

程序计数器:保存我当前线程马上要运行的下一行代码的位置。

程序计数器的设计与线程的启动有关!

当前线程挂起后,再恢复线程运行的时候,要用到程序计数器。

程序计数器的值如何变化?

字节码执行引擎执行class文件后修改的

动态链接:将符号引用转变为直接引用

方法名变量名都是符号引用

直接引用就是方法 在方法区域内部的内存入口地址

JVM是c语言和汇编语言实现的,要想理解透JVM还要解析源码,用到C语言

方法出口:在调用方法的时候,就会有方法出口生成,让方法执行完毕后,回到制定的位置

引用    指针

main的栈内部的局部变量和在堆里面的对象就是引用的关系 (堆:存的是内存地址)

栈和堆之间是一个指针关系。

方法区(元空间):常量+静态变量+类信息。

对象都是放在堆里   

本地方法栈:调用本地方法,也要用内存。

本地方法:用native修饰的方法,是用c语言实现的,调用了一些c语言的函数。

堆:

minor gc是什么   垃圾收集

垃圾收集线程:

gc roots  可达性分析算法

没有被引用

堆会放满,触发gc(年轻代gc)垃圾收集,收集非垃圾对象,将垃圾对象清理掉。

如果没有被清理掉,分带年龄会加1

老年代放满了,触发fullgc回收我们整个堆区域。如果老年代清理不掉对象触发OOM内存溢出。

JVM调优工具:

jvisualvm

Jmap

Jstack

阿里巴巴Arthas

阿里巴巴好强呀

STW: stop the world

JVM真正的目的:

gc会STW

前台做操作,后台突然GC了, 他会停掉用户的线程,造成卡顿,影响用户体验。

STW蚂蚁金服面试题目。

STW机制:

不STW,gc还没有结束,用户的线程就结束了,我之前标记为非垃圾的,变成了垃圾。就会乱套了。

不同的垃圾收集器,它的底层的STW是有区别的。

减少GC,JVM最终调优的目的是减少STW。

负GC是什么。

full GC

JVM调优的一个方案:

通过分析你的业务场景,然后设置JVM各区域内存比例大小。所以必须了解JVM的原理细节。

 RocketMQ:

 Kafka:

每种垃圾收集器的适用场景。

Java类加载机制

.class的二进制很多都是放在元数据区。

堆区的对象会有一个指针指向元数据区。

但是BootStrap ClassLoader在他的元数据区已经构建好对象了。但是在堆和栈中没有构建相应的对象,所以打印的是空。

从java的意义上看,它只能看到栈和堆中的变量。

我们加载一个类最典型的方式是通过classLoader的loadClass方法。

native是jvm中的c++实现的。

   准备:为静态变量分配内存。把对象的内存先给固定下来。

解析:我的内存当中,很多指针是需要指向我堆当中的一些东西,这个时候,在我的类没有加载完成的时候,这个指针还没办法知道指向哪,就可以称为是符号引用。当我这个内存的地址确定好了之后,那这个指针就真正指向内存当中具体的一个地址,这个时候可以称为直接引用。

半初始化: 将内存先占住,默认值是0,在后续的初始化过程中。再讲0给成我所需要的值。

final

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值