深入java虚拟机以及大数据
Posted z1427094386
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入java虚拟机以及大数据相关的知识,希望对你有一定的参考价值。
一、深入java虚拟机以及大数据
1.jvm的相关概念
当List放了大量的数据超过jvm中所能容纳的内存后,就会发生堆溢出。
当递归调用没有临界退出条件就会出现 栈溢出。
当批量导入大量数据或者用dom4j解析大的xml文件的时候,会出现 堆溢出,
这个时候可以通过分段批量提交以及用
sax代替dom4j来解决问题。
heap(堆),stack(栈)
2、jvm的结构细分及其概述?
Java 虚拟机有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。
简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的。
3、jvm 内存结构?
堆: 逻辑上是连续,物理上可以处于不连续的内存空间中,里面存储的是对象实例以及数组。可以细分为新生代,老生代。通过-Xmx和-Xms控制大小。
虚拟机栈:基本数据类型,对象引用(地址,指针)。
本地方法栈(了解):它与虚拟机栈发挥的作用差不多,区别在于虚拟机栈为java方法的执行提供服务,而本地方法栈为虚拟机使用到的Native(本地)方法服务。
方法区:放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息在Sun JDK中这块区域对应的为PermanetGeneration,又称为持久代,默认为64M,可通过-XX:PermSize以及-XX:MaxPermSize来指定其大小
在服务器启动的时候报内存溢出是因为方法区太小,也就相当于持久代的内存太小。
通过-XX:PermSize以及-XX:MaxPermSize来指定其大小,可以解决这个问题。
常量池是方法区的一部分,用来存储常量信息。如String就存储在常量池中。
计数器(了解):通过该计数器的值来选取下一条要执行的字节码指令。
4、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 信息
5、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:用户自定义的类加载器
6、linux中的命令:
ps -ef | grep :查看进程信息
vi:文件编辑命令
more:分页查看命令
top:常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况
ifconfig:显示或配置网络设备的命令
ping:它通常用来测试与目标主机的连通性
rsync、scp:文件同步命令
二、云计算+大数据的具体技术实现方案:
Hadoop是一个能够对大量数据进行分布式处理的软件框架。
它以并行的方式工作,通过并行处理加快处理速度,维护多个工作数据副本,具有可伸缩性,能够处理 PB 级数据.
hadoop 由许多元素构成。其最底部是HDFS,它存储 Hadoop 集群中所有存储节点上的文件。
HDFS的上一层是MapReduce 引擎.
hadoop下的子项目:
HDFS:Hadoop分布式文件系统
MapReduce:并行计算框架(建立在HDFS上的)
HBase: 类似Google BigTable的分布式NoSQL 列数据库
Hive:数据仓库工具
Zookeeper:分布式锁设施
Pig: 大数据分析平台,为用户提供多种接口
行业知识(了解):
存储容量:是该存储设备上可以存储数据的最大数量,通常使用千字节(kb kilobyte)、兆字节(MB megabyte)、吉字节(GB, gigabyte)、太字节(TB ,terabyte)和PB(Petabyte)、EB(Exabyte)等来衡量。
1KB=2(10)B=1024B; 括号中的数字为2的指数(即多少次方)
1MB=2(10)KB=1024KB=2(20)B;
1GB=2(10)MB=1024MB=2(30)B。
1TB=2(10) GB=1024GB=2(40)B
1PB=2(10) TB=1024TB=2(50)B
1EB=2(10) PB=1024PB=2(60)B
1Byte(相當於一個英文字母,您的名字相當6Bytes(6B)。
Kilobyte(KB)=1024B相當於一則短篇故事的內容。
Megabyte(MB)=l024KB相當於一則短篇小說的文字內容。
Gigabyte(GB)=1024MB相當於貝多芬第五樂章交響曲的樂譜內容。
Terabyte(TB)=1024GB相當於一家大型醫院中所有的X光圖片資訊量。
Petabyte(PB)=l024TB相當於50%的全美學術研究圖書館藏書資訊內容。
Exabyte (EB)=1024PB;5EB相當於至今全世界人類所講過的話語。
Zettabyte(ZB)=1024EB如同全世界海灘上的沙子數量總和。
Yottabyte(YB)=1024ZB相當於7000位人類體內的微細胞總和。
以上是关于深入java虚拟机以及大数据的主要内容,如果未能解决你的问题,请参考以下文章