java开发之JVM虚拟机

本文深入解析Java虚拟机(JVM)的概念、内存结构及其各部分的作用,包括类加载、方法区、堆、栈、本地方法栈、PC寄存器、执行引擎及垃圾回收机制等,并探讨了垃圾回收算法和JVM调优策略。

1.什么是java虚拟机?
所谓虚拟机就是一台虚拟机器,用来执行一系列虚拟计算指令
2.java虚拟机内存结构
class(源文件)—-classLoader(类加载器)—–方法区—-堆—-栈—–本地方法栈—-PC寄存器—–执行引擎—-垃圾回收机制
3.作用
1)class
通过编译后源文件
2)classLoader
加载class文件
3)方法区
方法区称为永久区,static关键字修饰的都会存放在方法区,当class文件被加载时初始化,是所有线程共享的
4)堆
创建对象、NEW、数组都会存放在堆内存中,堆是所有线程共享的,堆内存中分为新生代和老年代
5)栈
定义的局部变量和类的方法都会存放在栈内存中,好处是代码运行完毕自动释放内存,栈是每个线程私有的,互不共享,栈不会发生线程不安全问题
6)本地方法栈
本地方法栈主要调用C语言
7)PC寄存器
计算机组成原理
8)执行引擎
主要执行字节码文件
9)垃圾回收机制
不定时回收堆内存中资源
4.新生代和老年代
新生代:垃圾回收机制没有经常来回收的称为新生代,新创建的的对象会存放在Eden区,新生代分为Eden、S0和S1区,其中S0区和S1区大小相等,目的是垃圾回收算法
老年代:如果对象在频繁使用,对象会存放在老年区
作用:目的都是垃圾回收机制
5.垃圾回收机制调优
1).尽量减少垃圾回收次数
2)在web开发中尽量减少常量信息
3)新生代比老年代回收次数多一些
6.JVM参数调优
1.printGC
每次触发的时候打印相关信息
2.useSerialGC
串行回收
3.printGCDetails
更详细的GC日志
7.设置新生代和老年代比列
新生代与老年代的比例为1/3,或者是1/4
8.内存溢出
1)堆内存溢出
配置堆内存大小即可
2)栈内存溢出
栈内存溢出产生于递归调用,循环遍历不会产生,但是循环遍历方法中产生递归调用也会发生栈内存溢出,设置最大线程最大调用深度即可解决
9.垃圾回收机制
不定时去堆内存清理不可达对象
10.垃圾回收机制算法
1).引用计数法
每个对象都会有一个标记,默认是15次,GC回收时,发现对象不可达,就会减1,对象可达时就加1,如果加到大于15时就会晋升到s0区或者s1区
如果再加15次或者次数多时,就会将对象放入老年代中
优点:效率高
缺点:无法检测到循环引用,如果父类对象有一个对子类对象的引用,子类对象引用父类对象,这样他们的引用计数永远不可能为0,而且每次加减非常浪费内存
2).标记清除
为每个对象做一个标记,0表示可达,1表示不可达,当对象不常用,将对象标记为1,表示不可达,然后清除对象位置
缺点:不具有连续性,会产生碎片化
3).标记压缩
标记压缩法是在标记清除基础上做了优化,把存活对象压缩到内存一端,然后进行垃圾清理,java中老年代使用的是标记压缩法
4).复制算法
当新创建对象会存放在Eden区,当达到次数时对象会存放到s0区或者s1区,当发现对象没有经常被使用,首先会将s0区或s1区常用对象进行复制,然后直接清除不常用对象
5).分代算法
根据内存中对象的存活周期不同,将内存划分为几块,java的虚拟机中一般把内存划分为新生代和老年代,当新创建对象时一般在新生代中分配内存空间
当新生代垃圾收集器回收几次之后仍然存活的对象会被移动到老年代内存中,当大对象在新生代无法找到足够的连续内存时也直接在老年代中创建
对于新生代和老年代来说,新生代回收频率很高,但是每次回收耗时最短,而老年代回收频率较低,但是耗时较长,所以应该减少老年代GC
11.垃圾回收过程
不可达对象并不会马上会被直接回收,而是至少要经过两次标记的过程
第一次标记:会检查对象是否重写了finalize()方法,如果重写了该方法,则将其放入一个F-query队列队列中,否则直接将对象加入”即将回收”集合
第二次标记:第二次标记之前F-query队列中所有的对象会逐个执行finalize()方法,但是不保证该队列中所有对象的finalize()方法都会被执行
这是因为JVM创建一个低优先级的线程去运行此队列中的方法,很可能在没有遍历完之前就已经剥夺了运行的权利。
12.内存溢出和内存泄漏的区别
内存溢出:内存空间不足
内存泄漏:对象已经没有被应用程序使用,但是垃圾回收器无法移除,因为还被引用着。
13.垃圾收集器
分为串行收集器和并行收集器
串行收集器:单线程执行操作,回收期间会暂停所有线程执行,效率低。
并行收集器:在串行回收器基础上做了改进,可以使用多个线程同时进行垃圾回收,效率高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值