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