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. Angular Cookies 操作

    $cookiesProvider 使用$cookiesProvider改变$cookies服务的默认行为. 默认属性 path:字符串,cookies只在这个路径及其子路径可用.默认情况下,这个将会是 ...

  2. JavaScript 扯几句单线程相关

    JavaScript 扯几句单线程相关 众所周知,Javascript是单线程执行的,这也就是说:JavaScript在同一个时间上只能处理一件事.他不像C,Java等这些多 线程的,可以开不同的线程 ...

  3. EhLib DBGridEh组件在Delphi中应用全攻略总结(转)

    EhLib DBGridEh组件在Delphi中应用全攻略总结(转) http://blog.sina.com.cn/s/blog_94b1b40001013xn0.html 优化SQL查询:如何写出 ...

  4. 在ASP.NET MVC中使用JQ插件datatable

    1. Models public class Citys { public int Id { get; set; } public string CityName { get; set; } publ ...

  5. Codeforces374B

    B. Inna and Nine time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  6. win10下VS2015局域网调试配置

    一.前言 换win10页挺久了一直没有使用 IISExpress 的局域网功能,今天一使用才发现 win10 比起 win7 下配置多了许多坑. 二.配置步骤 首先我们先来拿到本机 ip 地址 打开命 ...

  7. TFS实现需求工作项自动级联保存

    目前在一个大型的金融客户软件研发平台项目实施和支持过程中,客户的质量管理团队基于该平台以及结合其它的平台数据,针对需求管理和业务过程需要拟定了一套完整的需求提出.评审.设计以及实现的流程.基于这套流程 ...

  8. mongodb终端指令

    -h [--help]显示此使用信息   --version显示版本信息   -f [--config] arg配置文件指定                                       ...

  9. .Net程序员学用Oracle系列(17):数据库管理工具(SQL Plus)

    1.数据库管理工具概述 2.SQL Plus 实用命令参考 2.1.连接/断开命令 2.2.执行 SQL 语句 2.3.执行 PL/SQL 语句 2.4.文件操作命令 2.5.修改用户密码 2.6.执 ...

  10. [DB] - Mysql创建定时任务

    mysql支持定时任务的创建,要求mysql服务器开始定时任务调度. 1. 查看是否开启定时任务执行 SHOW VARIABLES LIKE 'event_scheduler'; // OFF表示没有 ...