1、 java虚拟机概述和基本概念
1.1、虚拟机概述
桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位,那么物理网卡和虚拟网卡就相当于处于同一个网段,虚拟交换机就相当于一台现实网络中的交换机,所以两个网卡的IP地址也要设置为同一网段。
NAT模式中,就是让虚拟机借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。
NAT模式中,虚拟机的网卡和物理网卡的网络,不在同一个网络,虚拟机的网卡,是在vmware提供的一个虚拟网络。
在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、堆分配参数(一)
//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、堆溢出处理
//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自带命令的所有功能。
- 内存信息
- 线程信息
- Dump堆(本地进程)
- Dump线程(本地进程)
- 打开堆Dump。堆Dump可以用jmap来生成。
- 打开线程Dump
- 生成应用快照(包含内存信息、线程信息等等)
- 性能分析。 :idea: CPU分析(各个方法调用时间,检查哪些方法耗时多),内存分析(各类对象占用的内存,检查哪些类占用内存多)
- ……
手编不易,转载参考请注明来源。
欢迎大家点赞、留言