
JVM 源码分析
文章平均质量分 77
以OpenJDK源码为基础介绍和分析JVM
raintungli
这个作者很懒,什么都没留下…
展开
-
从如何在Java删除乱码文件中开始说起
1. 乱码文件为何会生成乱码文件?原因很多,在上传的过程中编码不对,操作提供不支持该编码等,如果你尝试用Java的File对象去删除文件,甚至判断是否存在该文件都会发现返回的都是FalseString[]entries = file.list(); for(String s: entries){ File currentFile = new File(file.getPa...原创 2019-03-13 16:17:06 · 1095 阅读 · 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 · 3062 阅读 · 0 评论 -
案例分享:如何通过JVM crash 的日志和core dump定位和分析Instrument引起的JVM crash
1. JVM crash了产品发来一份crash report, 什么是crash report请参考我的前期博客(http://blog.youkuaiyun.com/raintungli/article/details/7642575),下面是截取了crash report的部分,用于分析:# Problematic frame:# V [libjvm.so+0x5bbf05] instanceKl原创 2017-09-02 11:04:12 · 10283 阅读 · 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 · 9385 阅读 · 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 · 14948 阅读 · 0 评论 -
Java 8 动态类型语言Lambda表达式实现原理分析
Java 8支持动态语言,看到了很酷的Lambda表达式,对一直以静态类型语言自居的Java,让人看到了Java虚拟机可以支持动态语言的目标。原创 2017-02-07 17:22:18 · 13727 阅读 · 10 评论 -
Java Instrument (六) 动态重定义Class
在上篇博客(http://blog.youkuaiyun.com/raintungli/article/details/51646556)中提到了在on_attach的方式上如何重新定义class,里面也提到了最后attach时候会调用我们自定义的agent class的agentmain方法,在看Instrumentation的接口,里面本身提供了redfineClasses的方法也就是agentmai原创 2016-06-13 23:03:00 · 11200 阅读 · 1 评论 -
Java Instrument (五) Agent attach
首先先参考笔者前期的博客(http://blog.youkuaiyun.com/raintungli/article/details/7034005),先了解在jvm启动的过程中的两个线程Signal Dispatcher和Attach Listener在博客中,已经探讨了在Attach Listener 的线程在linux环境中创建了socket的文件,接着我们的关注点讲成为客户端如何写这个文件。原创 2016-06-12 23:22:26 · 6327 阅读 · 0 评论 -
Java Instrument (二) JVMTI
Java Instrument (二) JVMTI原创 2016-06-07 21:57:10 · 3775 阅读 · 0 评论 -
Java Instrument (三) 钩子函数
Java Instrument (三) 钩子函数原创 2016-06-07 22:02:41 · 2553 阅读 · 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 · 6047 阅读 · 0 评论 -
java中的SecureRandom在linux中的实现
在安全系统中,通常我们会使用securerandom去更安全的生成随机数,而默认的SecureRandom里使用的算法是SHA1PRNG。 Linux中的随机数发生器在Linux操作系统中,有一个特殊的设备文件,可以用作随机数发生器或伪随机数发生器。/dev/random在读取时,/dev/random设备会返回小于熵池噪声总数的随机字节。/dev/random可生成高随机性的原创 2015-01-19 19:52:28 · 26015 阅读 · 5 评论 -
Linux下关于TCP的keep alive的实现源码分析
TCP下的Keep Alive我们常说的TCP的keep alive,就是为了保证连接的有效性,在间隔一定的时间发探测包,根据回复来确认该连接是否有效。通常上层应用会自己提供心跳检测机制,而Linux内核本身也提供了从内核态确保连接有效性的方式。在sock 函数中可以设置是否需要打开keep alive开关,默认建立socket 是关闭keep alive的。代码如下 opt原创 2015-01-14 21:14:49 · 5001 阅读 · 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 · 4271 阅读 · 0 评论 -
自己动手编译hsdis
HSDIS 是hotspot 的一个工具,用于能够da yin原创 2014-10-21 17:44:02 · 4366 阅读 · 0 评论 -
Java (JDK7)中的String常量和String.intern的实现
Java中的String常量和String.intern的实现原创 2014-08-16 10:15:22 · 8106 阅读 · 4 评论 -
linux上TCP connection timeout的原因查找
最近在产线上经常出现connection timeout的问题原创 2014-07-16 17:37:44 · 40102 阅读 · 1 评论 -
JVM源码系列:ThreadMXBean 打出堆栈信息原理分析
我们通常会使用工具jstack 去跟踪线程信息,其如何实现使用attach 的方式还是ptrace 的方式,这些可以去参考本人的博客的其他文章。但这些方式都是外部使用的方式,如何直接使用java代码得到当前进程的线程的信息,方便监控jvm的整个运行状态,就不的不提到了ManagementFactory通过调用方法ThreadMXBean tmbean = ManagementFacto...原创 2014-03-15 16:28:21 · 6843 阅读 · 2 评论 -
java JNI 实现原理 (六) 调用JNI方法
在前面的博客中提到过调用的JNI的entry是generate_native_entry,也就是说方法generate_native_entry是最终调用的我们的c++写的库文件里的方法原创 2013-11-16 11:14:07 · 4730 阅读 · 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 · 4015 阅读 · 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 · 4892 阅读 · 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 · 6338 阅读 · 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 · 12788 阅读 · 0 评论 -
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 · 5988 阅读 · 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 · 24605 阅读 · 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 · 3327 阅读 · 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 · 13235 阅读 · 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 · 16511 阅读 · 0 评论 -
JVM源码系列:使用PrintAssembly打印java运行过程中的汇编
PrintAssembly是HotSpot JVM的一个诊断标志,允许我们获取JIT编译器/或者在解释过程中生成的汇编指令,通常可以通过分析执行的汇编指令可以帮助我们查找一些问题,也可以帮助我们分析和理解JVM 是如何解释和编译的。如何安装这些并不是JVM直接提供的,在JVM里需要使用插件的方式,Kenai项目则提供了这个插件下载:https://kenai.com/projects/b...原创 2013-08-08 11:29:54 · 8108 阅读 · 1 评论 -
JVM源码系列:java如何实现多态性,基于itable, vtable源码分析
在Java实现中我们常使用多态性,在java里主要是通过itable, vtable来实现准确的跳转。Vtable: 虚拟函数表该类所有函数自有函数(除了static, final)和 父类的函数虚拟表。结构:vtableEntry | vtableEntry |vtableEntry...是以vtableEntry 结构体的数组顺序结构,在每个entry 中保存了所调用的函数...原创 2013-03-22 16:33:55 · 7108 阅读 · 2 评论 -
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 · 34658 阅读 · 2 评论 -
jstat jvm 中关于java performance data的linux中的实现
曾今讨论过jstat 的实现,见另一篇博客(http://blog.youkuaiyun.com/raintungli/article/details/7444980),这里就不详细讨论了。jstat 主要是负责读取,而在这篇博客主要是讨论performance data的初始化和产生的。初始话当jvm main thread 启动的时候会初始化一些initialize global data原创 2013-02-07 15:55:46 · 2750 阅读 · 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 · 14512 阅读 · 0 评论 -
JVM源码系列: java InetAddress.getLocalHost() 在linux里实现
java 中的 InetAddress.getLocalHost() 在Inetaddress.getLocalHost()中最终调用的是Inet6AddressImpl.java(取决于你使用ipv4,还是ipv6) 中getLocalHostName的native代码最终在native代码中 JNIEXPORT jstring JNICALLJava_java_net_In...原创 2012-11-16 17:34:24 · 14519 阅读 · 0 评论 -
JVM源码系列:RandomAccessfile vs FileChannel 写文件
RandomAccessFile 和 FileChannel 是常用的写文件的方式,而一般都会推荐使用FileChannelImpl ,同事做了个测试,却发现FileChannelImpl写文件的性能比RandomAccessFile差。调用接口:RandomAccessFile.write(byte[] bytes)FileChannel.write(ByteBuffer src)...原创 2012-08-03 16:23:48 · 8589 阅读 · 4 评论 -
JVM源码系列: Java中的Intrinsics
在hotspot jvm里会定义一些intrinsic的方法,从而可以定义自己独有的一些编译的算法,根据不同的架构使用不同的指令集,比如Math.sin,Math.cos之类.对每个方法hotspot jvm都会定义一个instrinisics id, 这个id可以用于区分java 里自己定义的lib类的方法还是用户自己定义的java的类的方法,用户自己写的类会用 vmIntrinsics::...原创 2012-07-06 14:54:07 · 8291 阅读 · 0 评论 -
jvm crash 的崩溃日志详细分析及注意点
生成1. 生成error 文件的路径:你可以通过参数设置-XX:ErrorFile=/path/hs_error%p.log, 默认是在java运行的当前目录 [default: ./hs_err_pid%p.log]2. 参数-XX:OnError 可以在crash退出的时候执行命令,格式是-XX:OnError=“string”, 可以是命令的集合,用分号做分隔符, 可以用"%p原创 2012-06-07 17:00:01 · 50876 阅读 · 2 评论 -
jstat java工具在linux上的源码分析
jstat通常是作为使用查看gc 状态,编译信息等具体信息,加载class量等,笔者在前面的博客里谈了jmap,jstack工具的如何实现可具体参考(http://blog.youkuaiyun.com/raintungli/article/details/7023092) ,谈到通常的方法必须让jvm的所有线程进入一个safe point的状态,也就是在使用jmap, jstack工具的时候会有线程的停顿感原创 2012-04-10 15:59:46 · 4383 阅读 · 4 评论 -
Java 工具(jmap,jstack)在linux上的源码分析(七) -F 参数 如何读取线程列表
在java中,如何通过访问内存拿到线程列表,用于跟踪线程的运行状态,这也是jstack的主要功能。 在jvm里,有没有F的参数实现笔者前面的博客已经说明了。因为-F是通过访问java的内存来取的信息的,所以当使用-F参数的时候,需要知道java运行过程中内存的结构,从而通过访问内存能获取到你所需要的信息。1. 结构体 VMStructEntry 和 VMTypeEntry t...原创 2012-03-10 16:25:26 · 3543 阅读 · 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 · 4855 阅读 · 0 评论