深入浅出JVM之字节码执行 1.javap反汇编工具javap是jdk自带的反汇编工具,可以通过该命令查看编译后的class文件的常量池、字段以及方法等信息。对于下面的这个类:public class CalcCirc { public int doCalc() { int a=10; int b=20; int c=2; return (a+b)*c; }}使用javap -v CalcCi...
深入浅出JVM之Class文件结构 一、语言无关性jvm并不是只支持java语言,其他的语言如groovy,scala,ruby等,只要能够生产class文件,都可以在jvm上运行。最新版本的jvm上甚至还增加了一些新的指令,这些指令在java语言中无法使用,而在动态语言如groovy中才能使用。所以class文件才是jvm运行的基石。二、文件结构用二进制文件打开工具Notepad++或Winhex打开一个class文件,可以...
深入浅出JVM之锁及优化方法 一、线程安全当多个线程同时修改一个变量时会有线程安全问题,如果要保证这个变量时全局唯一进行修改,就需要给这个变量加锁,加锁后能够保证该变量的修改是串行进行的,因此该变量时线程安全的。但是需要牺牲一定的性能。比如ArrayList,该对象不是线程安全的,当线程A对该对象增加数据的时候,线程B也可以对该对象增加数据,当线程A的数组存储空间不足时会自动申请扩展空间,此时数据是不可用状态,而此时线程B...
深入浅出JVM之Java堆分析 一、内存溢出(OOM)的原因jvm中可能引起内存溢出的内存区域有堆、永久区、线程栈和直接内存。其中堆保存了所有的对象的内容,永久区保存对象的信息。这四个区域的内存空间得不到满足都有可能导致内存溢出。堆溢出由于对象不断的占用分配的空间,而这些对象的引用也没有及时的释放,堆的空间不断被占用,最终导致内存溢出。解决办法是增大堆空间,及时释放内存(减少对象被引用的时间)永久区由于系统中类的数量太...
深入浅出JVM之类装载器 class装载验证流程1.加载:这装载类的第一个阶段,取得类的二进制流,有三种方式,一个是直接从本地class文件获取,一个是从jar包中获取,一个是通过远程调用从网络获取类的二进制流。将类的内容(常量、字段和方法信息)转换为方法区的数据结构,然后在Java堆中生产对应的java.lang.Class对象。2.链接2.1验证: 保证Class二进制流的格式是否正确。...
深入浅出JVM之GC参数 一、堆的结构edens0s1tenured一个对象被创建后一般是会放在eden区的,但也有例外,比如局部变量会在栈上分配,超过一定阈值的大对象会直接放在老年代。s0和s1是幸存代,使用复制算法来复制对象,所以s0和s1的内存大小是一样的。当对象经过多次垃圾回收还存在的话就会被标记为老年对象,会将该对象放入到老年代(tenured)中。二、串行收集器最古老,...
深入浅出JVM之GC算法与种类 1.GC的概念Garbage Collection垃圾收集,在C或C++语言中,内存空间由程序员来释放,但是Java语言中程序员不会单独操作内存空间,所以内存释放需要由JVM来实现。在Java中,GC对象是堆空间和永久区。2.引用计数法老牌垃圾回收算法,通过计算对象的引用计数来标记对象是否是垃圾。该算法会为每个对象记录一下引用的次数,如果有一次引用就记录为1,如果有三次引用就标记为3,如果用...
深入浅出JVM之性能监控工具 一、系统性能监控linux操作系统中有很多命令可以查看应用程序的性能情况,下面介绍一下这些常用的命令:uptime:可以查看的信息有系统时间,运行时间,连接数-其中每一个终端算一个连接,1,5,15分钟内的系统平均负载,也就是运行队列中的平均进程数。这是一个操作系统级的命令,可以查看当前操作系统的整体的状况如何。top:常用的系统性能监控命令,可显示当前进程的cpu利用率和内存使用率,找到...
深入浅出JVM之常用jvm配置参数 1.Trace跟踪参数-verbose:gc 打开GC功能-XX:+printGC 打开GC日志在控制台显示-XX:+PrintGCTimeStamps 打印GC发生的时间戳-XX:+PrintGCDetails 打开GC详细信息,在程序调用结束后会打印出详细的堆内存信息,下面是在64位jdk1.7版本下使用参数:-Xmx10m -Xms10m -XX:+PrintGCDetails -X...
深入浅出JVM之JVM运行机制 一、JVM启动流程启动jvm首先在命令窗口输入java命令,该命令会根据当前路径和系统版本寻找jvm.cfg(该配置文件一般在JAVA_HOME/jre/lib/amd64文件夹下),来加载jvm的配置文件,根据这个配置文件寻找jvm.dll(JAVA_HOME\jre\bin\server),jvm.dll是jvm的主要实现。然后初始化JVM获得JNIEnv接口,java中通过findClas...
深入浅出JVM之JVM入门知识 一、Java语言规范:1.java语法java的语法比较简单,对于分支语句的结构如下:if then Statement:if(Expression) Statement对应的代码如下:if(true){do sth;}ArgumentList:在定义一个方法时可能需要指定方法的参数,这个参数个数可以是固定的,也可以是不固定的。jdk1.7之后支持多个参数2.词法结构:在源代...
HDFS架构 1.来源HDFS来源于Google在2003年10月份发表的FGS论文:《The Google File System》,HDFS是GFS克隆版。HDFS的全称是Hadoop Distributed File System。它是易于扩展的分布式文件,运行在大量的普通廉价机器上,提供了很好的容错机制。能够为大量用户提供新能不错的文件存取服务。2.结构介绍HDFS上的文件是以块来进行存储的...
Hive高阶之显示数据库名称和字段名 在hive中默认是不显示数据库的名称和数据表的字段名称的,这样我们在hive进行查询的时候就会发现不是很方便。默认hive的客户端执行方式如下:[root@node3 ~]# sudo -u hive hiveLogging initialized using configuration in jar:file:/opt/cloudera/parcels/CDH-5.15.2-1.cdh5.1...
Hive高阶之数据压缩详解 一般在hadoop集群上运行一个MapReduce会有以下步骤:input-> Map-> shuffle -> reduce -> output如果我们采用了数据压缩,在map阶段产生的数据大小就会减少,会减少磁盘的IO,同时还能够减少网络的IO。Linux操作系统中常见的压缩格式是bzip2、gzip、lzo、snappy这四种,这四种压缩方法的比较如下:压...
Hive高阶之数据压缩 Hive的压缩依赖于MapReduce的支持,也就是安装的hadoop组件,如果不支持的话就需要自行编译。常用的压缩方法是snappy压缩,而这种压缩方法依赖于操作系统的snappy组件,所以hadoop组件一般不默认编译,如果要支持的话就需要重新进行编译。好在CDH版本已经支持压缩方法了,不需要重新进行编译。我们可以通过hadoop命令查看当前的hadoop集群是否支持snappy压缩。[ro...
Hive高阶之Beeline与JDBC 从这篇笔记开始我们开始进入Hive的高级部分,这其中包括HiveServer2、Hive数据压缩、hive数据存储、hive企业优化等。首先看一下HiveServer2,该工作作为Hive的一个server端进行启动,供其他的工具使用。之前的hive基础知识部分的笔记都是以hive client为基础的,如果想用其他的工具比如jdbc、spark sql来使用hive就需要启动HiveServe...
Hive基础之UDF编程 UDF指用户定义函数,即在hive中进行客户化的函数,hive中自定义了很多function,我们使用show function命令可以很容易查看已有函数的用法:hive (default)> desc function split;OKtab_namesplit(str, regex) - Splits str around occurances that match regex...
Hive基础之排序查询 hive中排序查询的语法见:LanguageManual SortBy,排序中包括ORDER BY, SORT BY, CLUSTER BY, and DISTRIBUTE BY四种方法。1.order byorder by是与关系型数据库的用法是一样的,还以员工表emp为例,按照员工编号降序进行排列的查询语句如下:select * from emp order by empno desc;...