JVM
文章平均质量分 88
Java硬件工程师
中国科学技术大学毕业,原支付宝Java开发工程师,立志做一名资深全栈工程师
展开
-
JVM学习-CAS与原子类
1.CASCAS 即 Compare and Swap ,它体现的一种乐观锁的思想,比如多个线程要对一个共享的整型变量执 行 +1 操作:// 需要不断尝试 while(true) { int 旧值 = 共享变量 ; // 比如拿到了当前值 0 int 结果 = 旧值 + 1; // 在旧值 0 的基础上增加 1 ,正确结果是 1 /* 这时候如果别的线程把共享变量改成了 5,本线程的正确结果 1 就作废了,这时 compareAndSwap 返回 false,重新原创 2021-02-04 19:23:15 · 1285 阅读 · 1 评论 -
JVM学习-Java内存模型JMM
1.Java内存模型概述很多人将【java 内存结构】与【java 内存模型】傻傻分不清,【java 内存模型】是 Java Memory Model(JMM)的意思。关于它的权威解释,请参考 https://download.oracle.com/otn-pub/jcp/memory_model-1.0-pfdspec-oth-JSpec/memory_model-1_0-pfd-spec.pdf? AuthParam=1562811549_4d4994cbd5b59d964cd2907ea22ca0原创 2021-02-04 17:22:46 · 2127 阅读 · 8 评论 -
JVM学习-类加载器
1.类加载器概述Java虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(ClassLoader)以 JDK 8 为例:名称加载哪的类说明Bootstrap ClassLoader(启动类加载器)JAVA_HOME/jre/lib无法直接访问Extension ClassLoader (扩展类加载器)JAVA_HOM原创 2021-02-04 11:39:11 · 1566 阅读 · 5 评论 -
JVM学习-类加载
1.加载将类的字节码载入方法区(1.8后为元空间,在本地内存中)中,内部采用 C++ 的 instanceKlass 描述 java 类,它的重要 field 有:_java_mirror 即 java 的类镜像,例如对 String 来说,它的镜像类就是 String.class,作用是把 klass 暴露给 java 使用镜像起到一个桥梁的作用,Java对象不能直接访问instanceKlass 的信息,它得通过镜像_java_mirror 来访问。例如,对于String,Java只能先找到Stri原创 2021-02-03 22:48:51 · 2030 阅读 · 7 评论 -
JVM学习-字节码指令
1.入门接着上一节类文件结构,研究一下两组字节码指令,一个是public cn.itcast.jvm.t5.HelloWorld(); 构造方法的字节码指令2a b7 00 01 b1它实际上对应字节码的指令,java虚拟机内部有解释器,解释器会识别这些平台无关的字节码指令,把它们最终解释为机器码,然后执行。那么怎么知道机器码对应的字节码指令呢。请参考https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5原创 2021-02-03 16:54:27 · 1949 阅读 · 6 评论 -
JVM学习-类文件结构
1.类加载与字节码技术类加载与字节码技术包括以下内容1.类文件结构2.字节码指令3.编译期处理4.类加载阶段5.类加载器6.运行期优化本篇博文仅讲解类文件结构,余下的可以参看JVM系列(未完待续)2.类文件结构一个简单的helloworldpackage cn.yj.jvm;//HelloWorld示例public class HelloWorld { public static void main(String[] args){ System.out.p原创 2021-02-02 17:31:39 · 1438 阅读 · 1 评论 -
JVM学习-垃圾回收调优
1.GC调优预备知识预备知识掌握 GC 相关的 VM 参数,会基本的空间调整掌握相关工具明白一点:调优跟应用、环境有关,没有放之四海而皆准的法则查看虚拟机参数命令"F:\JAVA\JDK8.0\bin\java" -XX:+PrintFlagsFinal -version | findstr "GC"可以根据参数去查询具体的信息如ConGCThreads=0:CMS回收的并发线程数GCTimeRatio=99:并行GC,与吞吐量相关的GC时间占领MaxGCPauseMills:最大的原创 2021-02-02 13:06:32 · 1783 阅读 · 3 评论 -
JVM学习-G1回收器
1.简介定义:Garbage FirstJDK 9以后默认使用,而且替代了CMS 收集器适用场景同时注重吞吐量和低延迟(响应时间),默认暂停目标是200ms超大堆内存(内存大的),会将堆内存划分为多个大小相等的区域整体上是标记-整理算法,两个区域之间是复制算法它整体上使用标记整理算法,可以避免CMS垃圾回收器的标记清除算法产生的内存碎片问题。它也属于并发的垃圾回收器相关JVM参数-XX:+UseG1GC-XX:G1HeapRegionSize=size设置区域大小,区域要设置成1,原创 2021-02-01 22:08:57 · 1938 阅读 · 4 评论 -
JVM学习-垃圾回收器
1.垃圾回收器概述垃圾回收发生时,其他线程都暂停。STW是指stop the world的时间,即垃圾回收的时间1.串行单线程堆内存较小,适合个人电脑(CPU核数较少)2.吞吐量优先多线程:适合堆内存较大,需要多核CPU支持(只有单核的话,那么还要争抢,效率还不如单核CPU),适合工作在服务器上。让单位时间内,STW的时间最短。3.响应时间优先多线程堆内存较大,多核CPU,适合工作在服务器上尽可能让STW的单次时间最短。注意:吞吐量优先和响应时间优先的区别,举个例子,响应时间优先可原创 2021-01-31 21:46:11 · 2725 阅读 · 2 评论 -
JVM系列
1.Java内存结构(详细易懂)2.StringTable字符串常量池3.直接内存4.垃圾回收基础5.分代收集算法原创 2021-01-31 17:40:22 · 1817 阅读 · 7 评论 -
JVM学习-分代收集算法
1.分代回收算法概述1.1.分代回收算法简介我们在前面讲了三种垃圾回收算法,实际上,虚拟机结合这三种算法,让它们协同工作,具体的实现使用分代垃圾回收机制。我们将堆内存区域划分为新生代和老年代。新生代中又划分为伊甸园、幸存区From、幸存区To。因为Java中有的对象需要长时间使用,长时间使用的对象,我们将之放在老年代中,而那些用完了就可以丢弃的对象,我们将之放在新生代中,这样我们就可以根据对象生命周期的不同特点进行不同的垃圾回收策略。老年代的垃圾回收很久才一次,新生代的垃圾回收则比较频繁。针对不原创 2021-01-31 17:36:24 · 5144 阅读 · 10 评论 -
JVM学习-垃圾回收基础
1.判断垃圾是否可被回收1.1.引用计数法只要一个对象被其它对象所引用,那么我们就让这个对象的计数加1,如果被引用了两次,计数就变为2.如果某个对象不再引用它了,就让它的计数减1。当某个对象的引用计数变为0的时候,意味着没有人引用它,那么它就可以做垃圾回收。弊端:循环引用时,两个对象的计数都为1,导致两个对象都无法被释放Java虚拟机一般采用可达性分析算法1.2.可达性分析算法JVM中的垃圾回收器通过可达性分析来探索所有存活的对象GC Root根对象指的是肯定不会被垃圾回收的对象。扫描堆原创 2021-01-31 15:48:38 · 1836 阅读 · 5 评论 -
JVM学习-直接内存
1.直接内存概述它不能存在于JVM内存结构中属于操作系统,常见于NIO操作时,用于数据缓冲区bytebuffer所使用的内存就是直接内存分配回收成本较高,但读写性能高不受JVM内存回收管理通过以下程序测试直接内存的读写性能/** * 演示 ByteBuffer 作用 */public class Demo1_9 {//文件大概200M static final String FROM = "E:\\编程资料\\第三方教学视频\\youtube\\Getting Started原创 2021-01-31 12:36:29 · 1661 阅读 · 1 评论 -
JVM学习-StringTable字符串常量池
StringTable1.StringTable的特性1.1.面试题1.2.常量池与串池的关系1.3.字符串的拼接1.4.编译器优化1.5.intern方法1.5.1.intern方法(1.8)1.5.2.intern方法(1.6)1.6.StringTable的特性总结2.StringTable位置3.StringTable垃圾回收4.StringTable性能调优1.StringTable的特性1.1.面试题先看几道面试题:String s1 = "a"; String s2 = "b";原创 2021-01-31 10:30:25 · 2411 阅读 · 8 评论 -
JVM学习-Java内存结构(详细易懂)
1.JVM概述定义:JVM全称是Java Virtual Machine-java程序的运行环境(java二进制字节码的运行环境)好处:一次编写,到处运行(跨平台)自动内存管理,垃圾回收功能数组下标越界检查多态比较JVM,JRE,JDK之间的联系和区别,我们可以用一张图来解释JVM体系结构如图所示一个类从Java源代码(.java文件)编译成了Java二进制字节码以后,必须经过类加载器才能被加载到JVM里面才能运行。我们一般把类放在方法区里。类将来创建的对象放在堆的部分,而堆里原创 2021-01-30 21:54:19 · 9054 阅读 · 21 评论