android 插件开发遇到的坑 今天遇到一个坑,pdf 插件,调用了主工程的一个静态final 字符串,但是主工程里面已经没有这个字符串了,却没有崩溃. 后来同事说,因为字符串可能已经直接被写死了.你应该看下编译后的代码.我一同事,反编译apk 之后,发现,果然,因为provide 的jar 里面是有这个final 的字符串的,java 编译的时候,直接用死的值替换掉了.这样,根本就没有去调用主工程的那个变量. 总结: 1.provide 的 jar,不一定完全没有作用.final的变量,编译…
5.2一些案例: 1.高性能硬件部署策略: (1)背景:某公司升级了硬件(CPU升级为4核,内存增加为16G),发现不定期出现网页失去响应. (2)原因:①内存增加之后,项目中有在内存中处理文件的大对象,从而进入的老年代而没有进行及时回收,然后每次Full GC都要回收比较大量的对象:②Full GC的“Stop-The-World”; (3)处理方法: ①使用64位jdk,减少Full GC的次数,可以定时在深夜进行Full GC或者重启服务器,缺点:内存回收时间停顿很长,64位JDK比32位…
作者:京东科技 康志兴 1 JVM运行时内存划分 1.1 运行时数据区域 • 方法区 属于共享内存区域,存储已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据.运行时常量池,属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用. JDK1.8之前,Hotspot虚拟机对方法区的实现叫做永久代,1.8之后改为元空间.二者区别主要在于永久代是在JVM虚拟机中分配内存,而元空间则是在本地内存中分配的.很多类是在运行期间加载的,它们所占用的空间完全不可控,所以改为使用本地内存,…
作者:京东科技 康志兴 1 前言 随着Java的进化过程,涌现出各种不同的垃圾回收器,从串行执行到并行执行,从高吞吐到低延迟,终极目标就是让开发人员专注于程序的代码书写而无需关注内存管理. JDK早期出现的垃圾回收器通常单独作用于不同分代,到后期出现的G1开始,才可以进行全区域收集. 关于垃圾回收器的基础知识请翻看前一篇:从原理聊JVM(一):染色标记和垃圾回收算法 2 串行收集器(Serial) 比较老的收集器,单线程,所收集时必须暂停应用的工作线程,直到收集结束.但和其他收集器的单线程相比更…
作者:京东科技 康志兴 Shenandoah Shenandoah一词来自于印第安语,十九世纪四十年代有一首著名的航海歌曲在水手中广为流传,讲述一位年轻富商爱上印第安酋长Shenandoah的女儿的故事. 后来美国有一条位于Virginia州西部的小河以此命名,所以Shenandoah的中文译名为"情人渡". Shenandoah首次出现在Open JDK12中,是由Red Hat开发,主要为了解决之前各种垃圾回收器处理大堆时停顿较长的问题. 相比较G1将低停顿做到了百毫秒级别,She…
JVM系列五:JVM监测&工具[整理中]  http://www.cnblogs.com/redcreen/archive/2011/05/09/2040977.html 前几篇篇文章介绍了介绍了JVM的参数设置并给出了一些生产环境的JVM参数配置参考方案.正如之前文章中提到的JVM参数的设置需要根据应用的特性来进行设置,每个参数的设置都需要对JVM进行长时间的监测,并不断进行调整才能找到最佳设置方案.本文将介绍如果通过工具及Java api来监测JVM的运行状态,并详细介绍各工具的使用方法.…
Java语言写的源程序通过Java编译器,编译成与平台无关的‘字节码程序’(.class文件,也就是0,1二进制程序),然后在OS之上的Java解释器中解释执行,而JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器. 一.JVM原理 1.JVM简介: JVM是java的核心和基础,在java编译器和os平台之间的虚拟处理器.它是一种利用软件方法实现的抽象的计算机基于下层的操作系统和硬件平台,可以在上面执行java的字节码程序. java编译器只要面向JVM,生成JVM能理解…
0. 前言 Java虚拟机和真实的计算机一样,执行的都是二进制的机器码:而我们将.java 源码编译成.class 文件,class文件便是Java虚拟机可以认识的二进制机器码,Java可以识别class文件里的信息和机器指令,进而执行这些机器指令. 那么,Java虚拟机是怎样执行这些二进制的机器码的呢? 本文将通过一个很easy的样例,带你感受一下Java虚拟机执行机器码的过程和其工作的基本原理. 读完本文,你将会了解到: 1.Java虚拟机对执行时虚拟机栈(JVM Stack) 的组织 2.…
JVM(五):探究类加载过程-上 本文我们来研究一个Java字节码文件(Class文件)是如何加载入内存中的,在這個过程中涉及类加载过程中的加载,验证,准备,解析(连接),初始化,使用,销毁过程,并探讨实行这些过程的类加载器,以及其加载的逻辑. 概述 Java拥有动态加载类和动态连接的特性,因此其加载过程并不像其他语言在编译时就已经完成,它是动态进行的,即在程序运行过程中动态加载入内存中. 加载过程 在这里需要记住的是,图中的顺序说明的是阶段开始的顺序,并不是后面的阶段需要等到前面的执行完成后才…
1. Java的编译和执行 编译包括两种情况: 1,源码编译成字节码2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行也包括两种情况: 1,源码解释执行2,字节码解释执行 解释和编译执行的区别是:是否产生中间本地机器码. 即时编译生成机器相关的中间码,可重复执行缓存效率高.解释执行直接执行字节码,重复执行需要重复解释. 2. 编译原理 在执行前先对程序源码进行词法解析和语法解析处理,把源码转化为抽象语法树. 其中绿色的模块可以选择性实现. 上图中间的那条分支是解释执行的过程(即一条字…