一. jvm的相关概念
1 ) . 场景 : heap(堆)--stack(栈)
1.1 当List放了大量的数据超过jvm中所能容纳的内存后,就会发生堆溢出
1.2 当递归调用没有临界退出条件就会出现栈溢出
1.3 当批量导入大量数据或用dom4j解析大的xml文件时,便会出现堆溢出,可用分段批量提交以及用sax替代dom4j来解决
2 ) . 简述 : jvm的结构细分及其概述
2.1 堆 : java虚拟机有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配, 堆是在Java虚拟机启动时创建的
2.2 非堆 : 在JVM中堆之外的内存成为非堆内存(Non-heap memory),可看出JVM主要管理两种类型的内存 : 堆和非堆
2.3 小结 : 简单讲堆是java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的
3 ) . 简述 : jvm内存结构
3.1 堆
[1] 逻辑上是连续的,物理上可以处于不连续的内存空间中
[2]内存储的是对象实例以及数组
[3]可细分为新生代,老生代,通过-Xmx和Xms控制大小
3.2 虚拟机栈 :
[1]基本数据类型,对象引用(地址,指针)
3.3 本地方法栈 :
[1]作用与虚拟机栈差不多,区别在于虚拟机栈为java方法的执行提供服务,而本地方法栈为虚拟机使用到 的Native(本地)方法提供服务
3.4 方法区 :
[1 ]内存放加载的类的信息(名 称,修饰符等),类中的静态变量,类中定义为final类型的常量,类中的Field信息,类中的方法信息
[2]在Su nJDK中区域对应的是PermanetGern eration,又成为持久代,默认为64M,可通过-XX:PermSize以及-XX:MaxPermSize指定其大小
[3] 若服务器启动时报内 存溢出则因为方法区太小,也就是持久代中内存太小, 可通过-XX : PerSize以及-XX:MaxPerSize来指定其大小,解决该问题
3.5 常量池 :
[1] 其是方法区的一部分,用 来存储常量信息,如 : String就存储在常量池中
3.6 计数器
[1]通过该计数器的 值来选取下一条要执行的字节 码指令
4 ) . GC是什么,为什么要有GC?
4.1简述 :
[1]GC就是垃圾回收,
[2] java这种语言是动态分配内存大小的,而且依靠垃圾回收机制来完成对分配内存空间的回收,从而避免内存溢出问题,也在一定程度上降低了程序员工作的复杂度
4.2 generaton-->分代回收算法
[1] 阐述 : jvm中的GC采用了generation(分代回收)算法
[2] 来源 : 因大多数的对象存活时间较短,少部分对象才能够存活时间长,因此,jvm将堆和栈分为年轻代(young generation)和老年代(old generation)
[3] 解说 : 年轻代---年老代
年轻代中对象通常建立时间不久,且大部分生命周期也很短
年老代中的对象则已经创建比较久了,其声明周期也相对年轻代长
[4] 区别对待 : ---> 依据以上划分,jvm在做GC时进行了区别对待
对年轻代GC会相对比较频繁,且采用了copying(复制)算法;
对年老代GC相对比较少,且采用的是tracing算法的一种,是标记-清除-压缩
5 ) .JVM内存限制(最大值)
5.1 简述 :
[1]JVM内存的 最大值跟操作系 统有很大关系
[2] 简单将32位处理器虽然可控内存空间为4GB,但具体的操作系统会给一个限制,一般是2GB-3GB-->(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G)
[3]而64bit以上的处理器就不会有限制le
6 ) .Java监视和管理控制台
6.1 简述 : JConsole使您能够在运行时监视各种JVM资源统计信息
6.2 适用 :该特性适用于检测死锁,内存泄露
6.3 功能 :可链接到一个本地或远程JVM并可用来监视 :
[1]线程状态-->包括相关的锁
[2]内存使用情况
[3]垃圾收集
[4]运行时信息
[5]JVM信息
7 ) .jvm的调优?
7.1 开启-Server模式,增加堆的大小,以及持久代的大小,从而提高程序的运行效率
7.2 将 初始化堆大小和最大堆大小 设置为一样的值从而避免堆增长会带来的额外压力
7.3 持久代大小的设置同理,也设置为初始大小和最大堆大小一样大
8 ) .jvm的类加载机制?jvm中类的生命周期?
8.1 生命周期 :
Loading(加载)-->Linking(连接)-->Initalization(初始化)-->Using(使用)-->Unloading(卸载)
解说 :
[1] 对象基本上都是在jvm的堆区中创建,在创建对象之前,会触发类加载(加载,连接,初始化)
[2] 当类初始化完成后,根据类信息在堆中实例化类对象,初始化非静态变量,非静态代码,以及默认构造方法
[3] 当对象使用完之后会在合适的时候被jvm垃圾收集器回收
8.2 经过 : 类加载机制经过三步 : 加载(Load) ,链接(Link),初始化(Iniaializ)
[1] 链接 : 内又可分为 校验(Verify),准备(Prepare),解析(Resolve)三步
[2] 加载 : ClassLoader就是用来装载的,通过指定className,找到二进制码,生成Class实例,放到JVM中
[2.1]ClassLoader从顶向下分为 :
Bootstrap ClassLoader : 引导类加载器,负责加载java的核心类(如 : rt.jar)
Extension ClassLoader : 扩展类加载器,负责加载JRE的扩展目录(如 : JAVA_HOME/jre/lib/ext 中的jar包)
System ClassLoader : 系统(也称为应用) 类加载器,负责在JVM被启动时加载来自 在命令java中的 -classpath中的jar包
User-Defined ClassLoader : 用户自定义的类加载器
9 ) .linux中的命令 :
9.1 ps -ef | grep : 查看进程信息
9.2 vi : 文件编辑命令
9.3 more : 分页查看命令
9.4 top : 常用的性能分析工具,能够实时显示系统中各个进程的资源占用情况
9.5 ifconfig : 显示或配置网络设备的命令
9.6 ping : 通常用来测试与目标主机的连通性
9.7 rsync,scp : 文件同步命令