六部分内容:

一。内存模型

1.程序计数器,方法区,堆,栈,本地方法栈的作用,保存那些数据

可以画个大图出来,很清晰

jvm内存模型主要指运行时的数据区,包括5个部分。

栈也叫方法栈,是线程私有的,线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。

本地方法栈与栈类似,也是用来保存线程执行方法时的信息,不同的是,执行java方法使用栈,而执行native方法使用本地方法栈。

程序计数器保存着当前线程所执行的字节码位置,每个线程工作时都有一个独立的计数器。程序计数器为执行java方法服务,执行native方法时,程序计数器为空。

栈、本地方法栈、程序计数器这三个部分都是线程独占的。

堆是jvm管理的内存中最大的一块,堆被所有线程共享,目的是为了存放对象实例,几乎所有的对象实例都在这里分配。当堆内存没有可用的空间时,会抛出OOM异常。根据对象存活的周期不同,jvm把堆内存进行分代管理,由垃圾回收器来进行对象的回收管理。

方法区也是各个线程共享的内存区域,又叫非堆区。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,

jdk1.7中的永久代和1.8中的metaspace都是方法区的一种实现。

面试回答此知识点相关问题时,要答出两个要点:一个是各部分的功能,另一个是哪些线程共享,哪些独占。

二。类加载机制

1.双亲委派的加载机制

2.常用类加载器以及作用

3.双亲委派加载机制好处

4.如何判断是同一个class

三。GC垃圾回收

1.分代回收的思想和依据

java堆内存被分代管理,主要是为了方便垃圾回收。

因为,第一,大部分对象很快就不使用了

第二,有一部分不会立即无用,但也不会持续很长的时间!

所以堆内存进行分代管理的划分!

2.不同垃圾回收算法实现的思路以及适用的场景

按类型分为3种:

引用计数法:通过对象被引用的次数来确定对象是否被使用,缺点无法解决循环引用的问题!

复制算法:需要from和to两块大小相同的内存空间。对象分配只在from块,回收时把存活对象复制到to块,清空from,然后调换职权!from变成to,to变成from!缺点,内存使用率低!

标记清除算法:分为标记对象和清除不再使用的对象  两个阶段! 缺点,会产生内存碎片!

jvm中,年轻代回收算法serial、parNew、parallel scavenge都是复制算法!

CMS、G1、zgc都属于标记清除算法!

四。性能调优

1.常用jvm优化参数的作用

2.参数调优的依据

3.了解常用的jvm分析工具能分析哪类问题,以及使用方法

五。执行模式

1.解释,编译,混合模式的优缺点

2.了解java7提供的分层编译技术

3.知道JIT即时编译技术和OSR栈上替换

4.知道C1,C2编译器针对的场景,其中C2针对server模式,优化更激进

5.java10提供的由java实现的graal编译器

六。编译优化

1.前端编译器javac的编译过程

2.AST抽象语法书

3.编译期优化

4.运行期优化

5.编译优化的常用技术

包括公共子表达式的消除,方法内联,逃逸分析,栈上分配,同步消除等!明白了这些,才能写出对编译器友好的代码!

1.JVM内存模型

  • Java堆:线程共享的,唯一目的就是用于存放对象实例,是垃圾收集器管理的主要区域;
  • Java虚拟机栈:线程私有的,每个方法在执行的同时都会创建一个栈帧用于存储局部变量等,局部变量表存放了编译器可知的各种基本数据类型和对象引用
  • 本地方法栈:和虚拟机栈类似,不过它是为Native方法服务;
  • 程序计数器:线程私有的,可以看作是当前线程所执行的字节码的行号指示器,以便线程切换后恢复执行使用;
  • 方法区:线程共享的,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据;该区域的内存回收主要是针对常量池的回收和类型的卸载(特别是要注意一些动态字节码框架和自定义ClassLoader的场景下);在HotSpot里经常被称为永久代,在Java 8里已被废除了,被元空间取代

===============================================================

2.JVM内存回收机制

  1》堆内存

  堆内存是所有线程共有的,可以分为两个部分:年轻代和老年代。下图中的Perm代表的是永久代,但是注意永久代并不属于堆内存中的一部分,同时jdk1.8之后永久代也将被移除。

  2》垃圾回收主要作用在堆内存

  3》新生代(Young Generation):用于存放新创建的对象,采用复制回收方法,如果在s0和s1之间复制一定次数后,转移到年老代中。这里的垃圾回收叫做minor GC;

  4》老年代(Old Generation):这些对象垃圾回收的频率较低,采用的标记整理方法,这里的垃圾回收叫做 major GC。

  

  拓展:1.在进行垃圾回收的时候,怎么判断哪些对象是垃圾,要被回收

  通过两种方式

    1》引用计数【但是引用计数的方式无法解决循环引用的问题】

    2》可达性分析

  拓展:2.什么叫对象可达,什么叫对象不可达,什么是可达性分析

  通过一系列称为“GC Roots”的对象(比如虚拟机栈引用的对象、方法区中的类静态属性和常量引用对象)作为起点,从这些节点一直往下搜索,走过的路径称为引用链;而那些没有与引用链相连的对象即为不可达,会被回收。

  拓展:3.判断对象可以回收的情况

    1》对象显式的置空null

    2》局部引用指向的对象

    3》弱引用关联的对象

===============================================================

3.什么是GC,常用的GC算法有哪些?

  1》GC就是垃圾回收机制,就是JVM对内存中的对象进行管理的一个过程

  2》GC的过程如下:

1. Eden区最大,对外提供堆内存。当Eden区快要满了,则进行Minor GC,把存活对象放入Survivor A区,清空Eden区;
2. Eden区被清空后,继续对外提供堆内存;
3. 当Eden区再次被填满,此时对Eden区和Survivor A区同时进行Minor GC,把存活对象放入Survivor B区,同时清空Eden 区和Survivor A区;
4. Eden区继续对外提供堆内存,并重复上述过程,即在Eden区填满后,把Eden区和某个Survivor区的存活对象放到另一个Survivor区;
5. 当某个Survivor区被填满,且仍有对象未被复制完毕时或者某些对象在反复Survive 15次左右时,则把这部分剩余对象放到Old区;
6. 当Old区也被填满时,进行Major GC,对Old区进行垃圾回收。

  3》新生代采用的GC算法是 复制算法,而老年代采用的是标记-清除算法

  4》复制算法就是 eden区往s0复制,或者往s1复制的过程,默认次数15次

  5》标记-清除算法  是老年区依旧在用的对象标记可可达对象  清除就是清除不可达的对象。    

  拓展:GC触发条件

GC类型 触发条件 触发时发生了什么 注意 查看方式
YGC eden空间不足

清空Eden+from survivor中所有no ref的对象占用的内存
将eden+from sur中所有存活的对象copy到to sur中
一些对象将晋升到old中:
    to sur放不下的
    存活次数超过turning threshold中的
重新计算tenuring threshold(serial parallel GC会触发此项)

重新调整Eden 和from的大小(parallel GC会触发此项)

全过程暂停应用
是否为多线程处理由具体的GC决定
jstat –gcutil 
gc log
FGC

old空间不足
perm空间不足
显示调用System.GC, RMI等的定时触发
YGC时的悲观策略
dump live的内存信息时(jmap –dump:live)

清空heap中no ref的对象
permgen中已经被卸载的classloader中加载的class信息

如配置了CollectGenOFirst,则先触发YGC(针对serial GC)
如配置了ScavengeBeforeFullGC,则先触发YGC(针对serial GC)

全过程暂停应用
是否为多线程处理由具体的GC决定

是否压缩需要看配置的具体G

===============================================================

4.你是通过什么方式实现JVM优化的?

  1》调整新生代、s0、s1比例以及调整新生代 老年代的大小,目的是减少GC次数

  2》不要显示的调用system.GC()

  3》对象不用的时候显式的置为null

  4》尽量减少局部变量的使用

  5》尽量使用基本数据类型而不使用封装类

  6》尽量少使用静态变量,因为静态变量属于类的变量,是全局变量,会一直占用资源

  7》尽量分散的创建对象,不要一次性创建多个对象。

  8》https://www.cnblogs.com/sxdcgaq8080/p/10649367.html

===============================================================

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

https://www.cnblogs.com/panxuejun/p/5883044.html

===============================================================

【面试 JVM】【第六篇】JVM调优的更多相关文章

  1. visualvm工具远程对linux服务器上的JVM虚拟机进行监控与调优

    文/朱季谦 最近在做了一些JVM监控与调优的事情,算是第一次实践,还比较陌生,故而先把这一次经验简单记下笔记,这样,对后面学习调优方面时,不至于又想不起来了.本文档主要总结在window本地环境远程对 ...

  2. 阿里P8Java大牛仅用46张图让你弄懂JVM的体系结构与GC调优。

    本PPT从JVM体系结构概述.GC算法.Hotspot内存管理.Hotspot垃圾回收器.调优和监控工具六大方面进行讲述.图文并茂不生枯燥. 此PPT长达46页,全部展示篇幅过长,本文优先分享前十六页 ...

  3. JVM常用命令和性能调优建议 [Could not create the Java virtual machine]

    一.查看jvm常用命令jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. ...

  4. JVM常用命令和性能调优建议

      一.查看jvm常用命令jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程 ...

  5. JVM内存模型与性能调优

    堆内存(Heap) 堆是由Java虚拟机(JVM,下文提到的JVM特指Sun hotspot JVM)用来存放Java类.对象和静态成员的内存空间,Java程序中创建的所有对象都在堆中分配空间,堆只用 ...

  6. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  7. jvm参数解析(含调优过程)

    前阵       对底层账单系统进行了压测调优,调优的最后一步--jvm启动参数中,减小了线程的堆栈空间:-XX:ThreadStackSize=256K,缩减至原来的四分之一,效果明显,不过并没有调 ...

  8. JVM活学活用——调优工具

    概述 工具做为图形化界面来展示更能直观的发现问题,另一方面一些耗费性能的分析(dump文件分析)一般也不会在生产直接分析,往往dump下来的文件达1G左右,人工分析效率较低,因此利用工具来分析jvm相 ...

  9. JVM参数设置及条调优原理

    http://unixboy.iteye.com/blog/174173/     堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟 ...

  10. java中对JVM的深度解析、调优工具、垃圾回收

    jdk自带的JVM调优工具 jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具.jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工 ...

随机推荐

  1. django-ckeditor添加代码功能(codesnippet)

    最近做了一个博客,使用python3+django2.1开发的,后台编辑器和前端显示用的Django-ckeditor富文本编辑器,由于发现没有代码块功能,写上去的代码在前端展示有点乱,于是一顿问度娘 ...

  2. Linux下关于/tmp目录的清理规则

    本文将介绍Linux下/tmp目录的清理规则,rhel6和rhel7将以完全不同的两种方式进行清理. RHEL6 tmpwatch命令 tmpwatch 是专门用于解决“删除 xxx天没有被访问/修改 ...

  3. 【REDIS】 redis-cli 命令

    Redis提供了丰富的命令(command)对数据库和各种数据类型进行操作,这些command可以在Linux终端使用. 在编程时,比如使用Redis 的Java语言包,这些命令都有对应的方法.下面将 ...

  4. 【windows】【php】【nginx】windows 开机自启动nginx php 及nginx php配置

    #启动php-nginx   start-php-nginx.bat   @ECHO OFFECHO Starting PHP FastCGI...RunHiddenConsole.exe php-c ...

  5. Spring Cloud Stream在同一通道根据消息内容分发不同的消费逻辑

    应用场景 有的时候,我们对于同一通道中的消息处理,会通过判断头信息或者消息内容来做一些差异化处理,比如:可能在消息头信息中带入消息版本号,然后通过if判断来执行不同的处理逻辑,其代码结构可能是这样的: ...

  6. Python基础知识-day2

    格式化输出 %占位符,s字符串,d 数字, 表示%  用%% name = input("请输入姓名: ") age = input("请输入年龄: ") he ...

  7. ORACLE常用修改字段脚本

    describe employees; = select column_name,data_type,nullable,data_length,data_ precision,data_scale f ...

  8. 基于注解实现SpringBoot多数据源配置

    1.功能介绍 在实际的开发中,同一个项目中使用多个数据源是很常见的场景.最近在学习的过程中使用注解的方式实现了一个Springboot项目多数据源的功能.具体实现方式如下. 2.在applicatio ...

  9. 84. Spring Boot集成MongoDB【从零开始学Spring Boot】

    至于MongoDB网上有很多相关的资料,所以在这里不进行过多的介绍,我们在这里主要是介绍下如何将mongodb与spring boot结合使用.本节大纲: (1) 准备工作: (2) 新建一个mave ...

  10. Azure Storage Blob文件名区分大小写

    最近在使用Azure Storage的时候发现Storage的命名是区分大小写的,导致我们系统在更新图片的时候有时候更新不上,最终通过判断处理文件名解决. 因此我们在使用Storage需要注意一下文件 ...