摘要:
JVM内存分布图 执行字节码的模块叫做执行引擎,执行引擎依靠程序计数器恢复线程切换。本地内存包含元数据区域以及一些直接内存。 程序计数器(Program Counter Register) 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器,指向下一个将要执行的指令代码,由执行引擎来读 阅读全文
摘要:
Object objectRef = new Object(); 假设这句代码出现在方法体中,Object objectRef这部分将会反映到Java栈的本地变量中,作为一个reference类型数据出现。而new Object()这部分将会反映到Java堆中,形成一块存储Object类型所有实例数 阅读全文
摘要:
在发布或重启某线上某服务时,常常发现有些机器的load会飙到非常高(高达70),并持续较长一段时间(5分钟)后回落,与此同时响应时间曲线也与load曲线一致。注:load飙高的初始时刻是应用服务端口打开,流量打入时(load)。 发布时候load飙高 发布时候响应时间飙高 cpu使用率较高的两个线程 阅读全文
摘要:
创建bootstrapClassLoader,创建启动器Launcher。 父子加载器的类关系不是继承关系,子加载器通过parent变量引用父加载器。 为什么类加载的顺序不是从引导类加载器先加载,而是从应用类加载器加载? 因为只有AppClassLoader会检查类是否已被加载过。因为项目中大部分代 阅读全文
摘要:
tomcat如何实现,应用隔离类加载? org.apache.catalina.loader.WebappClassLoaderBase#loadClass(java.lang.String, boolean) (1)先在本地缓存中查找是否已经加载过该类(对于一些已经加载了的类,会被缓存在resou 阅读全文
摘要:
类加载顺序图: 这样做的好处就是:Java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存放在rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类 阅读全文
摘要:
对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆中划分出来。分配方式有指针碰撞和空闲列表两种,选择哪种分配方式由 Java 堆是否规整决定,而 Java 堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。 内存分配的两种方式 (补充内容 阅读全文
摘要:
首先进行类加载,然后会对象进行逃逸分析,如果对象引用不会逃逸,那么进行栈上分配。 编译器分层编译:C1、C2。C2下才会有栈上分配的优化,且不同虚拟机优化方式不一样,Hotspot虚拟机使用的是标量替换方式进行优化,把对象拆解,让对象的成员变量分配在栈上。 Class 文件需要加载到虚拟机中之后才能 阅读全文
摘要:
-XX:+PrintCommandLineFlags 打印那些已经被用户或者JVM设置过的详细的xx参数的名称和值。 -XX:+PrintFlagsInitial 打印所有JVM参数启动的初始值 -XX:+PrintFlagsFinal 打印所有JVM参数的最终值 -Xms6144m -Xmx614 阅读全文
摘要:
如果 young gc 线程只遍历年轻代内的对象引用,那么老年代到年轻代的跨代引用就会被忽略,被老年代存活对象跨代引用的年轻代对象会被回收,这样就破坏了应用程序的运行。但是如果每次ygc都进行全堆扫描,且ygc次数较频繁,会很慢。在 young gc 时,为了找到跨代引用,通常有这几个方法: 当对象 阅读全文
摘要:
一种以获取最短回收停顿时间为目标的收集器。 特点:基于标记-清除算法实现。并发收集、低停顿。 应用场景:适用于注重服务的响应速度,希望系统停顿时间STW最短,给用户带来更好的体验等场景下。如web程序、b/s服务。 CMS收集器的缺点: CMS收集器对CPU资源非常敏感,在并发阶段虽然不会导致用户线 阅读全文
摘要:
流程 resize 初始化大小16,负载因子0.75。 当桶节点个数大于扩容阈值,会进行扩容,容量扩大到2倍。 //离100最近的2次幂是128,默认负载因子是0.75,所以扩容阈值是128*0.75=96,以下put发生rehash HashMap hashMap = new HashMap(10 阅读全文