JVM 源码分析
文章平均质量分 73
raintungli
这个作者很懒,什么都没留下…
展开
-
JVM C1 编译优化:空检查擦除
1. 什么是空检查在Java里经常会判断一个对象是否为空,如果为空的对象访问方法,字段会抛出空指针异常,而空指针异常为运行异常,如果不抓取这个异常,有的时候会导致程序异常,为了解决这个问题,我们通常会在代码里显式的去判断该对象是否为空,进行为空的逻辑处理,这种做法逻辑虽然明确,但是由于空的逻辑并不是经常碰到,这样会导致有多余的逻辑分支判断。2. 隐式空检查 implicit exception我们先来看一个代码:public static int nullCheck(String valu原创 2020-10-19 18:52:43 · 4387 阅读 · 0 评论 -
JVM C1 编译优化:合并相同的表达式-Global Value Numbering 之实现
1. 原因为了合并相同的运算,避免重复计算,通常在编译过程中,编译器会尝试合并相同的计算。C1在初始的时候内部会构建图结构的HIR,它由基本块BB构成一个控制流图,每个基本块里面是SSA形式的指令。单个BB块中通过ValueNumbering 来实现,多个BB块里实现的合并叫做Global Value Numbering ,但其算法的本质是一致的。2. 值编号 Value Numbering值编号(Value numbering):是指为每个SSA的instruction计算一个Hash原创 2020-09-25 16:36:07 · 1048 阅读 · 1 评论 -
Linux下关于TCP的keep alive的实现源码分析
TCP下的Keep Alive我们常说的TCP的keep alive,就是为了保证连接的有效性,在间隔一定的时间发探测包,根据回复来确认该连接是否有效。通常上层应用会自己提供心跳检测机制,而Linux内核本身也提供了从内核态确保连接有效性的方式。在sock 函数中可以设置是否需要打开keep alive开关,默认建立socket 是关闭keep alive的。代码如下 opt原创 2015-01-14 21:14:49 · 4908 阅读 · 0 评论 -
linux上TCP connection timeout的原因查找
最近在产线上经常出现connection timeout的问题原创 2014-07-16 17:37:44 · 39630 阅读 · 1 评论 -
JVM源码系列:ThreadMXBean 打出堆栈信息原理分析
我们通常会使用工具jstack 去跟踪线程信息,其如何实现使用attach 的方式还是ptrace 的方式,这些可以去参考本人的博客的其他文章。但这些方式都是外部使用的方式,如何直接使用java代码得到当前进程的线程的信息,方便监控jvm的整个运行状态,就不的不提到了ManagementFactory通过调用方法ThreadMXBean tmbean = ManagementFacto...原创 2014-03-15 16:28:21 · 6756 阅读 · 2 评论 -
java JNI 实现原理 (二) Linux 下如何 load JNILibrary
在博客java JNI (一)虚拟机中classloader的JNILibrary 中讨论了java中的Library 是由classloader 来load的,那我们来看看 classloader是如何去load 一个library的ClassLoader.c JNIEXPORT void JNICALL Java_java_lang_ClassLoader_00024Nat原创 2013-11-09 06:03:19 · 5941 阅读 · 0 评论 -
java JNI 实现原理 (六) 调用JNI方法
在前面的博客中提到过调用的JNI的entry是generate_native_entry,也就是说方法generate_native_entry是最终调用的我们的c++写的库文件里的方法原创 2013-11-16 11:14:07 · 4649 阅读 · 0 评论 -
java JNI 实现原理 (五) JNI方法解释调用
Hotspot主要有两种解释器,而下面我们主要讨论的是 Template Intepreter也叫asm interprete解释器, 文章下面的介绍基本都是基于template解释器我们举一个invokespecial的例子,下面是templateTable方法解释invokespecial的代码void TemplateTable::invokespecial(int byte_no)原创 2013-11-15 08:25:08 · 3947 阅读 · 0 评论 -
java JNI 实现原理 (四) 初始化JNI方法
在调用函数的时候都会在template 解释器中会使用invokespecial -> prepare_invoke -> load_invoke_cp_cache_entry -> resolve_cache_and_index在代码中我们可以看到 case Bytecodes::_invokevirtual: case Bytecodes::_invokespeci原创 2013-11-15 08:24:12 · 4832 阅读 · 0 评论 -
java JNI 实现原理 (一)虚拟机中classloader的JNILibrary
调用JNI的时候,通常我们使用System.loadLibrary(String libname)来load JNI library, 同样也可以使用System.load(String fileName)来load JNI library,两者的区别是一个只需要设置库的名字,比如如果libA.so 只要输入A就可以了,而libA.so的位置可以同过设置 java.library.path 或者原创 2013-11-06 14:49:57 · 6246 阅读 · 1 评论 -
java JNI 实现原理 (三) JNI中的RegisterNatives方法
我们常用javah去生成JNI的头文件,然后去实现自己定义的JNI方法,使用这种方式比较传统,但是我们可以看到定义的格式甚至连名字都必须按照规范JNIEXPORT jint JNICALL Java_test_symlink (JNIEnv *, jobject, jstring, jstring);完整的结构是Java_classpath_classname_native m原创 2013-11-09 07:07:02 · 12687 阅读 · 0 评论 -
java垃圾回收那点事(五)ParallelGCThreads参数
为了提高垃圾回收的性能,java在parallel回收的时候可以设置同时并行处理的线程数也就是ParallelGCThreads,如果你没有设置该参数,该单数jvm会默认设置成online的cpu的数目,并不包括被shutdown的内核Linux 下获取online的cpu的核数int online_cpus = ::sysconf(_SC_NPROCESSORS_ONLN);原创 2013-09-12 17:49:19 · 24477 阅读 · 0 评论 -
java垃圾回收那点事(四)谁执行了GC的任务
在第一篇中曾经提到过,System.gc 曾经调用代码Universe::heap()->collect(GCCause::_java_lang_system_gc);而每个不同类型的gc,使用不同的heap策略,以parallelScavengeHeap 为例子void ParallelScavengeHeap::collect(GCCause::Cause cause) { a原创 2013-09-11 10:46:07 · 3295 阅读 · 0 评论 -
java垃圾回收那点事(二)究竟有多少GC
java的gc回收的类型主要有几种 UseSerialGC,UseConcMarkSweepGC,UseParNewGC,UseParallelGC,UseParallelOldGC,UseG1GC,而这几个参数是如何搭配的,实际上只要看下面的代码就非常清楚bool Arguments::check_gc_consistency() { bool status = true; // E原创 2013-09-10 16:30:33 · 13148 阅读 · 1 评论 -
java垃圾回收那点事(一) System.gc开始说起
java提供了从语言角度能够强制jvm进行垃圾回收,在我们的程序中会通过调用System.gc去强制jvm进行垃圾回收,通过源码我们可以看到实际上是调用了Runtime去强制gcpublic static void gc() { Runtime.getRuntime().gc(); }Runtime的gc方法是native方法也就是Rumtime.c中的JNIEXPORT v原创 2013-09-06 14:31:17 · 16459 阅读 · 0 评论 -
JVM源码系列:使用PrintAssembly打印java运行过程中的汇编
PrintAssembly是HotSpot JVM的一个诊断标志,允许我们获取JIT编译器/或者在解释过程中生成的汇编指令,通常可以通过分析执行的汇编指令可以帮助我们查找一些问题,也可以帮助我们分析和理解JVM 是如何解释和编译的。如何安装这些并不是JVM直接提供的,在JVM里需要使用插件的方式,Kenai项目则提供了这个插件下载:https://kenai.com/projects/b...原创 2013-08-08 11:29:54 · 7995 阅读 · 1 评论 -
JVM源码系列:java如何实现多态性,基于itable, vtable源码分析
在Java实现中我们常使用多态性,在java里主要是通过itable, vtable来实现准确的跳转。Vtable: 虚拟函数表该类所有函数自有函数(除了static, final)和 父类的函数虚拟表。结构:vtableEntry | vtableEntry |vtableEntry...是以vtableEntry 结构体的数组顺序结构,在每个entry 中保存了所调用的函数...原创 2013-03-22 16:33:55 · 6909 阅读 · 2 评论 -
Java (JDK7)中的String常量和String.intern的实现
Java中的String常量和String.intern的实现原创 2014-08-16 10:15:22 · 8071 阅读 · 4 评论 -
自己动手编译hsdis
HSDIS 是hotspot 的一个工具,用于能够da yin原创 2014-10-21 17:44:02 · 4312 阅读 · 0 评论 -
不要在linux上使用java 7 Files的接口参数StandardOpenOption.DELETE_ON_CLOSE
最近在看安全代码规范建议中提到关于如何删除创建的临时文件,推荐使用jdk7中的Files的函数,通过参数StandardOpenOption.DELETE_ON_CLOSE来控制代码示例BufferedWriter writer = Files.newBufferedWriter(tempFile, Charset.forName("UTF8"), StandardOpenOption.D原创 2015-01-07 19:50:17 · 4227 阅读 · 0 评论 -
从如何在Java删除乱码文件中开始说起
1. 乱码文件为何会生成乱码文件?原因很多,在上传的过程中编码不对,操作提供不支持该编码等,如果你尝试用Java的File对象去删除文件,甚至判断是否存在该文件都会发现返回的都是FalseString[]entries = file.list(); for(String s: entries){ File currentFile = new File(file.getPa...原创 2019-03-13 16:17:06 · 1028 阅读 · 0 评论 -
JVM源码系列:JVM内部运行之Class的Method
1. Class的属性在JVM中,通常一个class会初始化成Klass(接口), InstanceKlass(实例), Method(方法), ConstantsPool(常量区)在上图我们可以看到一个大概的Method,ConstantsPool,InstanceKlass之间的关系InstanceKlass 里面保存着ConstantPool指针Method指针的数组 Me...原创 2018-11-08 19:55:37 · 2922 阅读 · 0 评论 -
JVM源码研读:章节序列
Java 虚拟机基础JVM源码系列:JVM内部运行之Class的Method Java (JDK7)中的String常量和String.intern的实现 JVM源码系列:ThreadMXBean 打出堆栈信息原理分析 JVM源码系列:使用PrintAssembly打印java运行过程中的汇编 JVM源码系列:java如何实现多态性,基于itable, vtable源码分析 JVM源...原创 2018-11-09 09:16:59 · 3783 阅读 · 1 评论 -
案例分享:如何通过JVM crash 的日志和core dump定位和分析Instrument引起的JVM crash
1. JVM crash了产品发来一份crash report, 什么是crash report请参考我的前期博客(http://blog.csdn.net/raintungli/article/details/7642575),下面是截取了crash report的部分,用于分析:# Problematic frame:# V [libjvm.so+0x5bbf05] instanceKl原创 2017-09-02 11:04:12 · 10065 阅读 · 2 评论 -
Struts2远程命令执行漏洞 S2-045 源码分析
Struts2 又爆OGNL的高危漏洞S-045,又是OGNL的漏洞漏洞分析1. Struts 的上传request在上传文件里,Struts默认使用的是common upload 的上传组件, 为了能被action访问到上传的文件,通常会重新封装request, Spring也是这么做。JakartaStreamMultiPartRequest.java中 public void parse(...原创 2017-03-08 02:04:34 · 9305 阅读 · 3 评论 -
CVE-2016-1000031 Apache Commons FileUpload 反序列化漏洞深入分析
反序列化漏洞最近一直不得安宁,先有Apache Commons Collections通过反序列化实现远程代码执行,再有Spring RMI 反序列化漏洞,最新又有了common upload file的反序列化漏洞CVE-2016-1000031(https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-1000031)漏洞原因先来看原创 2017-02-20 15:45:26 · 14595 阅读 · 0 评论 -
Java 8 动态类型语言Lambda表达式实现原理分析
Java 8支持动态语言,看到了很酷的Lambda表达式,对一直以静态类型语言自居的Java,让人看到了Java虚拟机可以支持动态语言的目标。原创 2017-02-07 17:22:18 · 13633 阅读 · 10 评论 -
Java Instrument (六) 动态重定义Class
在上篇博客(http://blog.csdn.net/raintungli/article/details/51646556)中提到了在on_attach的方式上如何重新定义class,里面也提到了最后attach时候会调用我们自定义的agent class的agentmain方法,在看Instrumentation的接口,里面本身提供了redfineClasses的方法也就是agentmai原创 2016-06-13 23:03:00 · 10954 阅读 · 1 评论 -
Java Instrument (五) Agent attach
首先先参考笔者前期的博客(http://blog.csdn.net/raintungli/article/details/7034005),先了解在jvm启动的过程中的两个线程Signal Dispatcher和Attach Listener在博客中,已经探讨了在Attach Listener 的线程在linux环境中创建了socket的文件,接着我们的关注点讲成为客户端如何写这个文件。原创 2016-06-12 23:22:26 · 6237 阅读 · 0 评论 -
Java Instrument(一) Java Agent
1 AgentAgent在java中本质是一个动态库,利用JVMTI暴露出来的一些接口实现逻辑的入侵,需要实现如下的一个或者多个函数:JNIEXPORT jint JNICALLAgent_OnLoad(JavaVM *vm, char *options, void *reserved);JNIEXPORT jint JNICALLAgent_OnAttach(JavaV原创 2016-06-06 09:36:36 · 5925 阅读 · 0 评论 -
Java Instrument (二) JVMTI
Java Instrument (二) JVMTI原创 2016-06-07 21:57:10 · 3671 阅读 · 0 评论 -
Java Instrument (三) 钩子函数
Java Instrument (三) 钩子函数原创 2016-06-07 22:02:41 · 2508 阅读 · 0 评论 -
java中的SecureRandom在linux中的实现
在安全系统中,通常我们会使用securerandom去更安全的生成随机数,而默认的SecureRandom里使用的算法是SHA1PRNG。 Linux中的随机数发生器在Linux操作系统中,有一个特殊的设备文件,可以用作随机数发生器或伪随机数发生器。/dev/random在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的原创 2015-01-19 19:52:28 · 25759 阅读 · 5 评论 -
JVM源码系列: java 中的connection reset 异常处理分析
在Java中常看见的几个connection rest exception, Broken pipe, Connection reset,Connection reset by peerSocked reset case Linux中会有2个常见的sock reset 情况下的错误代码 ECONNRESET 该错误被描述为“connection rese...原创 2013-03-01 13:55:00 · 34524 阅读 · 2 评论 -
jstat jvm 中关于java performance data的linux中的实现
曾今讨论过jstat 的实现,见另一篇博客(http://blog.csdn.net/raintungli/article/details/7444980),这里就不详细讨论了。jstat 主要是负责读取,而在这篇博客主要是讨论performance data的初始化和产生的。初始话当jvm main thread 启动的时候会初始化一些initialize global data原创 2013-02-07 15:55:46 · 2708 阅读 · 0 评论 -
jsvc 启动java 在linux下的实现原理
jsvc 是在apache的daemon项目下开源项目,主要功能可以使一些运行在普通用户下的java进程获取一些root权限下的权利,比如端口在1024下等。如何运行在自己的java代码中,实现start, init , stop,destroy的方法,将自己的编译打成jar文件, 通过调用jsvc 来启动./jsvc -java-home /usr/java/jdk1.7原创 2012-12-06 16:03:38 · 14449 阅读 · 0 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(七) -F 参数 如何读取线程列表
在java中,如何通过访问内存拿到线程列表,用于跟踪线程的运行状态,这也是jstack的主要功能。 在jvm里,有没有F的参数实现笔者前面的博客已经说明了。因为-F是通过访问java的内存来取的信息的,所以当使用-F参数的时候,需要知道java运行过程中内存的结构,从而通过访问内存能获取到你所需要的信息。1. 结构体 VMStructEntry 和 VMTypeEntry t...原创 2012-03-10 16:25:26 · 3481 阅读 · 0 评论 -
JVM源码系列:java 中关于自定义信号在linux下的实现
在java 中调用Signal的方法handle可以去注册一个信号的处理函数,方法的如下: public static synchronized SignalHandler handle(Signal sig, SignalHandler handler) {....}比如常用的addShutdownHook钩子函数,在收到SHUTDOWN1_SIGNA...原创 2012-03-01 17:19:25 · 4780 阅读 · 0 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(六) -F 参数 读取动态链接共享库文件中的符号表
通常我们使用jmap,jstack 去检查堆栈信息的时候,是不会使用-f参数的,但有的时候系统在无法打印出堆栈信息的时候,会建议你使用参数-F。关于-F参数与非-F参数的区别笔者已经在前面的博客中讲述(http://blog.csdn.net/raintungli/article/details/7023092),简单的说也就是一种是让jvm进程自己打印出堆栈信息,另有一种是直接访问jvm的堆原创 2012-02-24 14:25:53 · 3549 阅读 · 0 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(五) -F 参数的bug
当使用jmap,jstack是用-F参数的时候,是通过调用系统调用ptrace来取的寄存器的信息,关于linux下的ptrace实现可以参考我的博客(http://blog.csdn.net/raintungli/article/details/6563867)在jdk6u23版本之前你会发现,当你使用jstack -F的时候 经常在logger 里面 看到错误信息,直接抛出异常,根本无法看到原创 2012-02-09 16:32:32 · 11545 阅读 · 1 评论