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. js原生继承之——构造函数式继承实例

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  2. cygwin下配置alias

    主要是cygwin下的盘符映射关系容易忘,直接用mount命令: 所以,找到E:\cygwin64\home\Administrator下面的.bashrc,添加alias.如下:

  3. JavaScript原生的节点操作

    前言:原生是Javascript的基础,还是需要多多重视,时间长都忘记了,现在整理一下. 获取子节点 children 不是标准的dom属性,但是几乎被所有浏览器支持.不包含文本节点. 注意:在IE中 ...

  4. .net 开发经理的月薪

    因为各人的成长不一样,有人工作了5年,技术也只能当个高级程序员,有人工作了两年,就能带领一个团队,有人在初中时期就写了一个很牛X 的框架,而我工作也快5年,也努力奋斗了5年,我觉得自己有能力做开发经理 ...

  5. 没有苹果电脑打包iOS平台的 Ionic 2程序——《Ionic 2 实例开发》更新内容

    没有苹果电脑打包iOS平台的 Ionic 2程序--<Ionic 2 实例开发>更新内容春节刚过,祝各位新的一年里万事如意,一帆风顺.<Ionic 2 实例开发>在这段时间里更 ...

  6. Form开发:字段关系-消息-快速编码-参数和系统变量

     1.字段关系  清除依赖字段:在挂LOV的名称字段的WHEN-VALIDATE-ITEM调用:app_field.clear_dependent_fields    设置字段依赖:在主字段的WHEN ...

  7. canvas粒子时钟

    前面的话 本文将使用canvas实现粒子时钟效果 效果展示 点阵数字 digit.js是一个三维数组,包含的是0到9以及冒号(digit[10])的二维点阵.每个数字的点阵表示是7*10大小的二维数组 ...

  8. Wireshark网络抓包(三)——网络协议

    一.ARP协议 ARP(Address Resolution Protocol)地址解析协议,将IP地址解析成MAC地址. IP地址在OSI模型第三层,MAC地址在OSI第二层,彼此不直接通信: 在通 ...

  9. LoadRunner 调用Dll完成加密解密

    LoadRunner里的函数比较少,没有MD5.Base64加密. 我们可以通过在C++里把一些加解密写成函数,供LR调用. DLL函数编写 C++里新建工程Class Library(此处是用VS2 ...

  10. Web Worker无阻塞UI的牛逼技术,html5,可惜无法敢于UI

    众所周知,JavaScript是单线程的,JS和UI更新共享同一个进程的部分原因是它们之间互访频繁,但由于共享同一个进程也就会造成js代码在运行的时候用户点击界面元素而没有任何响应这样的情况,这么糟糕 ...