深入java虚拟机以及大数据

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-2GLinux系统 下为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:它通常用来测试与目标主机的连通性

 

rsyncscp:文件同步命令

你可能感兴趣的:(深入java虚拟机以及大数据)