JVM优化

1.什么是JVM

Java虚拟机,编译java文件让Java代码无需考虑平台的差异,运行在不同的环境中。

2.为什么要优化JVM

       项目在运行时突然出现卡顿,效率低下并发增加,想让程序平稳顺畅的运行,所以我们需要针对实际的需要来进行优化。

3.首先讲解一下JVM的组成有哪些?

一、首先是类加载器子系统:加载.class字节码文件到jvm内存中

二、运行时数据区:有堆、方法区、虚拟机栈、本地方法栈、程序计数器

三、执行引擎:有即时编译器和垃圾收集,将文件编译成指令码二进制让硬件设备能识别。

四、本地方法库 :接入其他语言lib库

 4.类加载过程

        加载:找到字节码文件,将文件加载到jvm内存中

        验证:验证是否是一个字节码文件

        准备:为类中的static准备的变量设置初始值为null或0

        解析:这个阶段会去找到类加载到内存的地址

        初始化:对变量进行赋值的阶段

5.JVM中内置的类加载器

        使用了双亲委派模式:打比方说,优先爷爷(启动类加载器)先进行加载,在轮到爸爸(扩展类加载器)加载,他两都不加载就自己加载。这里如果爷爷加载了,下面就不会加载了,目的:不让我们覆盖系统提供的功能,也让我扩展自己的功能。

6.运行时数据区

        上面已经说了运行时区的组成,堆和方法区是线程共享的,其他3个区域是线程隔离的,JDK1.8以后,方法区被元空间替代,没有方法区了,元空间直接使用本地内存 。

 方法区:jdk1.7之前他是堆的一个逻辑部分,为了和堆做区分方法区还有一个名字叫非堆,也有人用“永久代”表示。在jdk1.8中方法区变成了元空间,与堆内存分开,存在在本地内存。

消除永久代原因:

        1.字符串存在永久代中容易出现性能问题和内存溢出。

        2.类方法难以缺点其大小,太小永久代难以指定,太大则容易导致老年代溢出。

        3.永久代会为GC带来复杂度,回收性能降低。

堆内存:

        也是GC主要区域,堆内存主要来存放对象和数组,分为新生代、老年代其中新生代分为Eden、From Survivor、To Survivor 。

JVM面试题

        1.程序内存溢出了,如何定位问题出在哪儿?

        打印JS日志导出,通过jvisualvm工具进行分析找出错误,对问题进行优化修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值