JVM深入解析、性能调优

 

1、 java虚拟机概述和基本概念

1.1、虚拟机概述

1.2、JVM内存模型

1.3、基本概念说明

2、 堆、栈、方法区

2.1、堆

2.3、栈

2.3、方法区

3、了解虚拟机参数

3.1、堆分配参数(一)

3.2、堆分配参数(二)

3.3、堆溢出处理

3.4、栈配置

3.5、方法区配置

3.6、直接内存配置

4、垃圾回收概念和算法及对象的分代转换

4.1、垃圾回收概念

4.2、垃圾收集算法

4.3、垃圾回收时的停顿现象

4.4、对象如何进入老年代

4.5、TLAB

4.6、对象创建流程图

5、性能监控工具

5.1、jvisualvm


 

1、 java虚拟机概述和基本概念

1.1、虚拟机概述

注:

  1. 目前JVM使用HotSpot虚拟机
  2. VMWare虚拟机的网络连接模式分为三种:

1)桥接

  桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位,那么物理网卡和虚拟网卡就相当于处于同一个网段,虚拟交换机就相当于一台现实网络中的交换机,所以两个网卡的IP地址也要设置为同一网段。

2)NAT

  NAT模式中,就是让虚拟机借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。

  NAT模式中,虚拟机的网卡和物理网卡的网络,不在同一个网络,虚拟机的网卡,是在vmware提供的一个虚拟网络。

3)Host-Only

  在Host-Only模式下,虚拟网络是一个全封闭的网络,它唯一能够访问的就是主机。其实Host-Only网络和NAT网络很相似,不同的地方就是Host-Only网络没有NAT服务,所以虚拟网络不能连接到Internet。主机和虚拟机之间的通信是通过VMware Network Adepter VMnet1虚拟网卡来实现的。

  Host-Only的宗旨就是建立一个与外界隔绝的内部网络,来提高内网的安全性。这个功能或许对普通用户来说没有多大意义,但大型服务商会常常利用这个功能。如果你想为VMnet1网段提供路由功能,那就需要使用RRAS,而不能使用XP或2000的ICS,因为ICS会把内网的IP地址改为192.168.0.1,但虚拟机是不会给VMnet1虚拟网卡分配这个地址的,那么主机和虚拟机之间就不能通信了。

1.2、JVM内存模型

1.3、基本概念说明

2、 堆、栈、方法区

2.1、堆

2.3、栈

2.3、方法区

3、了解虚拟机参数

3.1、堆分配参数(一)

注:-XX配置系统级别

非-XX配置应用级别

+启用

-禁用

示例代码:

//JVM Option:-Xms5m -Xmx10m -XX:+PrintCommandLineFlags

public static void main(String[] args){

        System.out.println("初始参数:");

        System.out.println("maxMemory:"+Runtime.getRuntime().maxMemory());

        System.out.println("freeMemory:"+Runtime.getRuntime().freeMemory());

        System.out.println("totalMemory:"+Runtime.getRuntime().totalMemory());

        System.out.println("---------------------------");

        byte[] b1 = new byte[1*1024*1024];

        System.out.println("分配了1M");

        System.out.println("maxMemory:"+Runtime.getRuntime().maxMemory());

        System.out.println("freeMemory:"+Runtime.getRuntime().freeMemory());

        System.out.println("totalMemory:"+Runtime.getRuntime().totalMemory());

        System.out.println("---------------------------");

        byte[] b2 = new byte[5*1024*1024];

        System.out.println("分配了5M");

        System.out.println("maxMemory:"+Runtime.getRuntime().maxMemory());

        System.out.println("freeMemory:"+Runtime.getRuntime().freeMemory());

        System.out.println("totalMemory:"+Runtime.getRuntime().totalMemory());

}

3.2、堆分配参数(二)

示例代码:

//JVM Option:-Xms20m -Xmx20m -Xmn1m -XX:SurvivorRatio=2 -XX:+PrintGCDetails -XX:+UseSerialGC

//JVM Option:-Xms20m -Xmx20m -Xmn7m -XX:NewRatio=3  -XX:+PrintGCDetails -XX:+UseSerialGC

byte[] b=null;

for (int i = 0; i < 10; i++) {

    b=new byte[1*1024*1024];

}

3.3、堆溢出处理

(备注:该工具为eclipse的内存分析插件)

示例代码:

//JVM Option:-Xms2m -Xmx2m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:\demo3.dump

Vector v=new Vector();

for (int i = 0; i < 5; i++) {

    v.add(new byte[1*1024*1024]);

}

3.4、栈配置

示例代码:

//JVM Option:-Xss1m

private  static  int count;

public static void recount(){

    count++;

    recount();

}

public static void main(String[] args) {

    try {

        recount();

    } catch (Throwable e) {

        System.out.println(count);

        e.printStackTrace();

    }

}

3.5、方法区配置

3.6、直接内存配置

4、垃圾回收概念和算法及对象的分代转换

4.1、垃圾回收概念

4.2、垃圾收集算法

(备注:新生代内对象更换快,为了内存操作部分尽可能的小,提高性能)

4.3、垃圾回收时的停顿现象

4.4、对象如何进入老年代

示例代码:

//JVM Option:-Xmx20m -Xms20m -XX:MaxTenuringThreshold=15 -XX:+PrintGCDetails

Map<Integer,byte[]> map=new HashMap<>();

for (int i = 0; i < 5; i++) {

    map.put(i+1,new byte[1024*1024]);

}

for (int i = 0; i < 600; i++) {

    byte[] b=new byte[1014*1024];

}

示例代码:

//JVM Option:-Xmx20m -Xms20m -XX:+UseSerialGC -XX:PretenureSizeThreshold=1000 -XX:+PrintGCDetails

Map<Integer,byte[]> map=new HashMap<>();

for (int i = 0; i < 5*1024; i++) {

    map.put(i+1,new byte[1024]);

}

4.5、TLAB

示例代码:

public static void alloc(){

    byte[] b=new byte[2];

}

public static void main(String[] args) {

    long start=System.currentTimeMillis();

    //JVM Option:-XX:+UseTLAB -XX:+PrintGC -XX:TLABSize=102400 -XX:-ResizeTLAB -XX:TLABRefillWasteFraction=100 -XX:-DoEscapeAnalysis -server

    for (int i = 0; i < 1000000; i++) {

        alloc();

    }

    long end=System.currentTimeMillis();

    System.out.println(end-start);

}

4.6、对象创建流程图

5、性能监控工具

5.1、jvisualvm

jvisualvm能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈

jvisualvm使用简单,几乎0配置,功能还是比较丰富的,几乎囊括了其它JDK自带命令的所有功能。

  1. 内存信息
  2. 线程信息
  3. Dump堆(本地进程)
  4. Dump线程(本地进程)
  5. 打开堆Dump。堆Dump可以用jmap来生成。
  6. 打开线程Dump
  7. 生成应用快照(包含内存信息、线程信息等等)
  8. 性能分析。 :idea: CPU分析(各个方法调用时间,检查哪些方法耗时多),内存分析(各类对象占用的内存,检查哪些类占用内存多)
  9. ……

(备注:JDK自带监控工具)

 

手编不易,转载参考请注明来源。

欢迎大家点赞、留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值