常见JAVA面试题总结<2020 java面试必备>(三)JVM

本文详细介绍了JVM内存结构,包括Java栈内存、堆内存和元空间。探讨了内存溢出和内存泄漏的区别,以及垃圾回收机制,如GC Roots、垃圾收集算法和收集器的选择。同时,讲解了JVM调优常用参数,如-Xms、-Xmx等,并讨论了常见的JVM问题,如OOM异常和CPU负载过高的排查方法。此外,还涵盖了Java对象的引用类型和双亲委派模型。
摘要由CSDN通过智能技术生成

JVM

JVM内存结构模型

(1)类加载器:负责加载class文件
​(2)线程共享内存(堆内存):静态变量、常量、类信息、运行时常量池、实例变量(new出来的对象)
​(3)线程私有内存(栈内存):虚拟机栈、本地方法栈,PC程序寄存器
​(4)总结:栈管运行、堆管存储

Java栈内存

(1)什么是栈
1.1)栈也叫栈内存,主管Java程序的运行
​ 1.2)是在线程创建时创建,它的生命周期是跟随线程的生命期的,对于栈来说不存在垃圾回收问题
​(2)栈存储什么
2.1)本地变量:输入参数和输出参数以及方法内变量
2.2)栈操作:记录出栈、入栈的操作
​ 2.3)栈帧数据:包括类文件、方法等
(3)栈运行原理
​ 3.1)栈中的数据都是以栈帧的格式存在,栈帧是一个内存区块,一个有关方法和运行期数据的数据集
​ 3.2)当一个方法A被调用时就产生一个栈帧F1,并被压入到栈中
​ 3.3)A方法又调用B方法,于是产生栈帧F2,也被压入到栈中
​ 3.4)执行完毕后,先弹出F2,再弹出F1,栈运行是遵循 “先进后出”/ “后进先出”的原则
(4)栈异常
4.1)java.lang.StackOverflowError
4.2)在java中函数栈调用层级过多,导致当前线程的栈满了,就会出现此异常,比如:方法调用如出现死循环这种情况

内存溢出和内存泄漏的区别

内存溢出:指程序在申请内存时,没有足够的内存空间供其使用,出现OOM
内存泄漏:指分配出去的内存不再使用,但是无法回收
JVM垃圾回收的时候如何确定垃圾?是否知道什么是GC Roots?

什么是垃圾

内存中已经不再被使用到的空间就是垃圾

JVM垃圾回收的时候如何确定垃圾

如果程序中无法再引用到该对象,这个状态称为不可达,那么该对象就可以作为回收对象被垃圾回收器回收
所谓不可达就是从根对象(GC roots)开始无法引用到该对象,该对象就是不可达的

Java中可以作为GC Roots的对象

虚拟机栈中引用的对象
方法区静态成员引用的对象
方法区常量引用对象
本地方法栈中Native方法引用的对象

你说你做过JVM调优和参数配置,请问如何查看JVM系统默认值

了解JVM参数的类型

Boolean类型

公式:-XX: +或者-某个属性 (+表示开启 -表示关闭)
例子:开启打印GC收集日志 -XX:+PrintGCDetails

KV设值类型

公式:-XX: 属性key=属性值value
例子:设置MetaspaceSize空间大小 -XX:MetaspaceSize=128m

了解JVM常用的相关命令

jps -l

image

查看当前正在运行的Java程序

jinfo -flags 进程号

image

查看某个Java程序当前正在使用的所有JVM参数
Non-default:表示系统根据当前机器性能自动设置的参数
Command line:表示人为添加的一些参数

jinfo -flag MetaspaceSize 进程号在这里插入图片描述

查看某个Java程序,它的某个JVM参数是否开启,具体值是多少

java -XX:+PrintFlagsInitial 和 java -XX:+PrintFlagsFinal -version

image

PrintFlagsInitial :查看JVM配置的初始默认值,这个会根据系统的内存大小而变化
PrintFlagsFinal : 查看JVM修改过的配置初始参数,等号前面添加了 : 表示是修改过的值

java -XX:+PrintCommandLineFlags

运行时,将当前Java程序使用的JVM参数打印出来,可查看使用的是什么垃圾

怎么查看服务器Java默认的垃圾收集器是哪个

image

java -XX:+PrintCommandLineFlags -version

你平时工作用过的JVM常用基本配置参数有哪些?

-Xms

初始堆内存,默认为物理内存的 1/64
等价于 -XX:InitialHeapSize

-Xmx

最大堆内存,默认为物理内存的 1/4
等价于 -XX:MaxHeapSize

-Xss

设置线程栈大小,一般默认为512k ~ 1024k,Oracle官方文档中写到从 64位的Linux系统默认都设置为1024K
等价于 -XX:ThreadStackSize

-XX:MetaspaceSize

设置元空间大小,Java默认只设置了20M,如果需要可自行通过此参数调配
​JDK8元空间和JDK7永久代最大区别在于:元空间并不在虚拟机中,而是使用本地内存,因此默认情况下,元空间的大小只受本地内存限制

-XX:+PrintGCDetails

设置打印GC日志

打印的GC日志内容

image

把GC日志打印存储到文件中
-Xloggc:/path/gc.log​
GC日志内容解析

日志规律:[ 名称 ] [ GC前内存占用 ] -> GC后内存占用 [ 该区内存总大小 ]

年轻代GC 日志内容解析

image

老年代 Full GC 日志内容解析

image

-XX:SurvivorRatio

设置新生代中的占比,也就是 Eden 和 S0/S1 的比例,S0/S1相同
此值默认是 -XX:SurvivorRation=8,表示 Eden:S0:S1 = 8:1:1

-XX:NewRatio

设置老年代的占比,剩下的1给新生代
此值默认是2,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值