1、JVM内存查看与分析,编写内存泄露实例

堆区、栈区、方法区、本机内存都有可能内存溢出。在这里编写堆区内存溢出实例。如下(来自《深入理解Java虚拟机》一书。

// -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
public class HeapOutOfMemoryError {
	static class OOMObject{}
	public static void main(String[] args) {
		List<OOMObject> list = new ArrayList<OOMObject>();
		while(true){
			list.add(new OOMObject());
		}
	}
}

编写溢出实例主要知道两点内容:

(1)不断创建实例对象,以占满堆空间

(2)保证GC Roots到对象之间有可达路径来避免垃圾回收

最后运行的结果如下截图。

Dump出快照后查看泄露对象和泄露对象到GC Roots的引用链。安装Eclipse Memory Analyzer到Eclipse IDE进行内存快照查看。

插件安装地址:http://www.eclipse.org/mat/downloads.php

使用jstat命令来查看JVM内存的分配与使用情况,如下:

jstat -gc 24170(进程号) 1000(第1000ms采集一次数据) 2(采集两次数据)

结果如下:

S0C:S0区容量(S1区相同)   S0U:S0区已使用
EC:  E区容量           EU:E区已使用
OC: 老年代容量          OU:老年代已使用
MC: 元数据容量          MU: 元数据区已使用
YGC:  Young GC(Minor GC)次数   YGCT:Young GC总耗时   FGC:  Full GC次数  FGCT:Full GC总耗时  GCT: GC总耗时

也可以使用Java VisualVM图形界面进行查看。一般可以装个Visual GC插件,如下所示。

介绍一下如上截图的参数。

1、Compile Time(编译时间):855compiles 表示编译总数,6.606s表示编译累计时间。一个脉冲表示一次JIT编译,窄脉冲表示持续时间短,宽脉冲表示持续时间长。

2、Class Loader Time(类加载时间): 20869loaded表示加载类数量, 139 unloaded表示卸载的类数量,40.630s表示类加载花费的时间

3、GC Time(GC Time):2392collections表示垃圾收集的总次数,37.454s表示垃圾收集花费的时间,last cause表示最近垃圾收集的原因

4、Eden Space(Eden 区):括号内的31.500M表示最大容量,9.750M表示当前容量,后面的4.362M表示当前使用情况,2313collections表示垃圾收集次数,8.458s表示垃圾收集花费时间

5、Survivor 0/Survivor 1(S0和S1区):括号内的3.938M表示最大容量,1.188M表示当前容量,之后的值是当前使用情况

6、Old Gen(老年代):括号内的170.500M表示最大容量,67.500M表示当前容量,之后的31.825表示当前使用情况,3collections表示垃圾收集次数 ,450.789s表示垃圾收集花费时间

7、Perm Gen(永久代):括号内的96.000M表示最大容量,70.250M表示当前容量,之后的35.129M表示当前使用情况

2、对象的分配以及出发Minor GC与Full GC的条件

对象优先在Eden分配,当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC。

在发生Minor GC之前,JDK7规则是只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小,会发生Minor GC,否则会发生Full GC。

3、类加载过程,如何获得当前对象的ClassLoader

类加载的过程分为:加载、连接、初始化、使用和卸载。其中连接又可以分为:验证、准备和解析

获取当前对象的ClassLoader通过如下代码:

this.getClass().getClassLoader()  // 获取当前对象的类对象,然后调用getClassLoader

类加载器可以进行类层次的划分、OSGi、热部署和代码加密等。那么用户如何自定义类加载器呢?

要创建用户自己的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可,该方法根据参数指定类的名字,返回对应的Class对象的引用。

findClass protected Class<?> findClass(String name)   throws ClassNotFoundException

使用指定的二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被 loadClass 方法调用。默认实现抛出一个 ClassNotFoundException。

4、Java的先行发生关系 happens-before

JMM(Java内存模型)为所有程序内部动作定义了一个偏序关系,叫做happens-before。要想保证执行动作B的线程看到动作A的结果(无论A和B是否发生在同一个线程中),A和B之间就必须满足happens-before关系。

参考《深入理解Java虚拟机》376页

5、JVM的类载入器

(1)每个类加载器都加载哪些类

(2)如何自定义自己的类加载器,自己的类加载器和Java自带的类加载器关系如何处理

不同类加载器的命名空间关系:

同一个命名空间内的类是相互可见的。

子加载器的命名空间包含所有父加载器的命名空间。因此子加载器加载的类能看见父加载器加载的类。例如系统类加载器加载的类能看见根类加载器加载的类。

由父加载器加载的类不能看见子加载器加载的类。

如果两个加载器之间没有直接或间接的父子关系,那么它们各自加载的类相互不可见。

参考:

《Java程序员修炼之道》第110页,看依赖注入中的类加载器

6、垃圾回收策略

说一下G1的回收策略。

 

Java面试01|JVM相关的更多相关文章

  1. 2019上半年总结——Github上那些Java面试、学习相关仓库

    分享一下最近逛Github看到了一些对于Java面试以及学习有帮助的仓库,这些仓库涉及Java核心知识点整理.Java常见面试题.算法.基础知识点比如网络和操作系统等等. 知识点相关 1.JavaGu ...

  2. Java面试之JVM原理总结

    1.什么是JVM? 答:JVM是Java Virual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,他是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟计算机功能来实现 ...

  3. Java面试06|项目相关介绍

    1.明确你的项目到底是做什么的,有哪些功能 广告投放机:项目主要是为移动端有针对性的进行广告展示. 媒体管理平台SSP:为媒体端实现多种变现途径 (1)广告投放机中关于广告检索与排序的功能 1.广告检 ...

  4. Java面试----01.JavaSE

    1.面向对象和面向过程的区别 面向过程:面向过程性能比面向对象高. 因为类调用时需要实例化,比较消耗资源,所以当性能是最重要的考虑因素时,比如单片机.嵌入式开发.Linux/Unix等一般采用面向对象 ...

  5. Java面试01

    一.谈谈你对java的理解 1.平台无关性,一次编译到处运行 2.GC 3.语言特性 4.面向对象 5.类库 6.异常处理 二.Java如何做到一次编译到处运行?(如何做到平台无关性) 首先我们先来编 ...

  6. java面试(Web相关)06

    1.JSP 和 servlet 有什么区别? JSP 是 servlet 技术的扩展,本质上就是 servlet 的简易方式.servlet 和 JSP 最主要的不同点在于,servlet 的应用逻辑 ...

  7. 【Java面试】JVM如何判断一个对象可以被回收

    Hi, 我是Mic. 今天分享一道一线互联网公司必问的面试题. "JVM如何判断一个对象可以被回收" 关于这个问题,来看看普通人和高手的回答. 普通人: 嗯.......... 高 ...

  8. Java面试——从JVM角度比较equals和==的区别

    1.  Java中数据类型分类 1.1    基本数据类型 又称为原始数据类型,byte,short,char,int,long,float,double,boolean,他们之间的比较应该使用(== ...

  9. 【Java面试必备JVM】JVM看这篇就够了

    链接–>JVM

随机推荐

  1. Java线程:条件变量、原子量、线程池等

    一.条件变量 条件变量实现了java.util.concurrent.locks.Condition接口,条件变量的实例化就是通过一个Lock对象上调用newCondition()方法获得的,这样条件 ...

  2. easyUI tootip组件使用

    easyUI tootip组件使用: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  3. 内存快照排查OOM,加密时错误方法指定provider方式错误引起的OOM

    写在前面: 最近开始总结内存方面的东西,已经总结以前遇到的一些内存案例分享下,接下来还有几篇,然后是进程/线程相关的,逐渐形成我的知识体系树 如果你有兴趣,可以文章末尾的公众号二维码一起梳理这些信息. ...

  4. 浅谈Django的Q查询以及AngularJS的Datatables分页插件

    使用Q查询,首先要导入Q模块: from django.db.models import Q 可以组合使用&,|操作符用于多个Q的对象,产生一个新的Q对象,Q对象也可以用~操作符放在前面表示否 ...

  5. iOS WebViewJavascriptBridge初步尝试与图文详细讲解

    JS和OC的交互这是个永恒话题,使用场景也是越来越多,如今一些reactnative.vue框架等,都是在重点结合原生与H5的混合使用. 那么,如何快捷方便的使用两者交互是一个很重要的关键点. 1.传 ...

  6. 重写titleView

    在一些特定的情况下不能使用原有的titleView需要重写titleView代码如下 #import "TitleView.h" @implementation TitleView ...

  7. 融云发送手机短信验证短信(.net版本)

    首先本次需求是在MVC5中进行的,通过收费的融云服务来验证手机号码,而且本次的项目也是前后台分离,所以添加了WEBAPI2,那么先添加WEBAPI的接口 using System; using Sys ...

  8. java socket初步学习一 ( tcp)

    Java socket通信程序: 第一版本: 实现功能: 服务器地址:127.0.0.1  端口:5050 客户机:端口5050 客户端发送字符:“t” 服务器接收到该字符并回复:“r” 流程: 建立 ...

  9. asp.net core mvc剖析:处理管道构建

    在启动流程文章中提到,在WebHost类中,通过BuildApplication完成http请求处理管道的构建.在来看一下代码: ...... //这个调用的就是Startup.cs类中的Config ...

  10. Sublime Text 3 修改配色主题【侧边框之...】

    Sublime Text3 是挺喜欢的一款编辑器,一周五天朝九晚六面对,而默认的侧边栏颜色总显得不尽人意.右侧的代码高亮[color_scheme:Monokai]挺喜欢的,心里就想着如何把侧边栏也给 ...