JVM学习

JVM基础学习

最新发现好多面试题都需要介绍JVM的相关知识,于是就想梳理自己学习的JVM知识

一、JVM是什么?

Java Virtual Machine(Java虚拟机),我们的代码其实都是在JVM中运行的.

二、JVM内存模型

1.metaspace(元数据区)

我们自己写的各个类的信息在方法区中,jdk8以后,对应的区域叫做metaspace,元数据空间

2.程序计数器

JVM用自己的字节码执行引擎,执行每行代码,为了记录当前代码执行到哪个位置,也就是说执行到哪一行指令了,这个时候就会用到程序计数器

3.Java虚拟机栈

类在元数据区,那么类中的方法在哪里呢,我们知道每个方法都是由一个线程去执行的,每个线程中都有一个Java虚拟机栈,它是用来保存类中的局部变量的,当执行main()方法时,main方法会创建一个栈帧,将栈帧带入main线程的Java虚拟机栈中.同时main方法中有局部变量,这个局部变量也会进入Java虚拟机栈中.
注意:这里的局部变量只是变量名称,不是真正的对象实例

4.Java堆内存

在虚拟机栈中存放的只是局部变量的名称,那么真正的对象时在堆内存中的,此时Java虚拟机栈中的局部变量会"引用"真正在堆内存中存放的对象实例的地址.

二 JVM垃圾回收机制作用

简单说,就是帮我们回收垃圾(不会在用的)对象.
要知道,我们每次创建一个对象,他都是要占用我们的内存空间的,只要启动一个JVM进程,他会自带一个垃圾回收的后台线程.这个线程会在后台不断的检查JVM的堆内存中的各个实例对象
当有实例对象没有被引用,就说明这个对象就是垃圾对象了,既然是垃圾,赶紧回收吧.从内存中清楚掉,被让他占用内存空间了.
扩展:一个对象自己本身的信息会占用一部分空间,对象的实例作为数据也会占用一部分的空间

三 JVM分代模型

我们创建的对象大部分存活周期是很短的,少数是较长的,极少是很长的.
于是就有了对应的新生代,老年代,永久代.
一般属于新生代的对象大部分是局部变量,用一次就用不到了,老年代中的对象一部分是静态变量,他会被用多次.永久代说的一般是方法区.

3.1 新生代垃圾回收

一般新创建的对象都会先存放在新生代中的,当我们执行多个方法后,发现为新生代分配占的内存空间满了,内存不够用了,怎么办,垃圾回收呗,这个时候就会触发新生代垃圾回收机制Minor GC(或者叫Young GC),他会尝试把那些没有**被引用**的对象回收掉.这个时候又有空间了,可以创建新的对象了.
但是我们想想,有一部分静态变量可能你回收N次,他都会有引用,对这种经历了多次垃圾回收却还存在的对象,JVM有一个规定:(**如果一个实例对象在新生代中,成功的在15次垃圾回收之后,还存在,说明他已经15岁了**,)一般在新生代中10岁的对象成了一个**老人**,那么他就会被转入老年代了.

3.2 老年代垃圾回收

新生代发生多次垃圾回收,老年代中的对象可能会慢慢增多,当他达到我们给老年代分配的空间大小时,他也会进行垃圾回收.

3.3 总结:

新建的对象一般在新生代中分配 -> 新生代满了,开始Young GC -> 有对象超过10岁,就会进入老年代 -> 老年代满了,触发老年代垃圾回收.

四 JVM模型分析

我们知道了创建的对象会占用内存空间,那么怎么给出合理的内存空间呢,**简单分析流程**

假设有个订单系统
(1) 当高并发处理大量订单时,每秒要处理多少订单, 假设高峰期一小时总共有100万订单,那么每秒处理36万/60/60,每秒大概100单
(2) 那么每处理一个订单需要耗费多长时间,假设耗时1s,那么就是1秒要处理100个订单.
(3)每个订单会占用多少的内存空间呢,一个int变量占4B,long是8B…,算出所有变量的和,假设是1KB
(4) 那么每秒会创建的对象会占用多大的内存空间呢,100个订单对象,每个订单1KB,100个订单也就是约为100KB
(5) 运行系统,每秒也会创建其他对象,我们将值扩大20倍,也就是每秒会生成2000KB的对象,一分钟2000KBX60约为120M.
(6) 结合我们为系统分配到新生代空间大小,假设是200M,也就是1分钟就会执行一次GC,这样就会频繁执行GC.肯定是有问题的.

那么怎么处理,分布式部署,加几台机器或者在内存足够的情况下,多为堆空间配置资源.

提示:个人总结,欢迎各位大佬指教

下班下班

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值