jvm

01-022【jvm】CAS与原子类ABA问题

旧城冷巷雨未停 提交于 2020-01-30 17:19:55
CAS即Compare and Swap ,体现了乐观锁思想 CAS CAS是什么? CAS:即Compare-And-Swap,它是一条CPU并发原语,它的功能是判断内存某个位置的值是否为预期值,如果是则更改为新的值,这个过程是原子的。 获取共享变量时,为了保证该变量的可见性,需要使用volatile修饰。结合CAS和volatile可以实现无锁并发,适用于竞争不激烈、多核CPU的场景下。 底层原理 CAS并发原语 体现在java语言中就是sun.misc. UnSafe类 中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现CAS汇编指令。这是一种 完全依赖于硬件 的功能,通过它实现了原子操作。再次强调,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且 原语的执行必须是连续的,在执行过程中不允许被中断 ,也就是说 CAS是一条CPU的原子指令,不会造成所谓的数据不一致的问题 。 以AtomicInteger为例,源码 源码 public final int getAndIncrement ( ) { return unsafe . getAndAddInt ( this , valueOffset , 1 ) ; } 那么UnSafe类是什么? 在rt.jar中,jdk的基础类,其中方法均由native修饰

jvm调优

做~自己de王妃 提交于 2020-01-30 16:37:25
jvm调优主要是关注吞吐量、停顿时间。 1.获取gc日志 默认使用的是ParallelGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc.log 2.CMS日志 -XX:+UseG1GC -Xloggc:cms-gc.log 3.G1日志 -XX:+UseG1GC -Xloggc:g1-gc.log 4.GC日志文件分析工具 a.GCViewer 打开gc日志进行分析 b.G1调优指南 是否选用G1垃圾收集器的判断依据 (1)50%以上的堆被存活对象占用 (2)对象分配和晋升的速度变化非常大 (3)垃圾回收时间比较长 c.jvm调优主要是不断调整各类参数,最终选择适合参数,满足最终需求 比如调整内存参数,再次获取gc日志分析 -XX:MetaspaceSize=512M -Xms512M -Xmx512M 调整最大停顿时间 -XX:MaxGCPauseMillis=25 设置最大GC停顿时间指标 调整堆内存占用百分比 -XX:InitiatingHeapOccupancyPercent=45 G1用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的 使用比例。值为 0 则表示“一直执行GC循环)’. 默认值为 45 (例如, 全部的 45% 或者使用了45%).

Java面试题——JVM(10)

拟墨画扇 提交于 2020-01-30 12:46:37
题目:假如生产环境程序CPU占有过高,请谈谈你的分析思路和定位。 结合linux和jdk命令一块分析案例 步骤如下 1、先用top命令找出cpu占用最高的 2、ps -ef或者jps进一步定位,得知是一个怎么样的一个后台程序 3、定位到具体线程或者代码 ps -mp 进程编号 -o THREAD,tid,time 参数解释: -m 显示所有的线程 -p pid 进程使用cpu的时间 -o 该参数后是用户自定义格式 4、将需要的线程ID转换为16进制格式( 英文小写 格式) 命令: printf “%x\n” 有问题的线程ID 5102转换为16进制为13ee 5、jstack 进程ID|grep tid(16进制格式ID英文小写)-A60 来源: CSDN 作者: Huntermax25 链接: https://blog.csdn.net/qq_33805483/article/details/104112870

Understanding Jeprofile output

倖福魔咒の 提交于 2020-01-30 11:23:57
问题 I was able to generate the Jeprofile output as follows based on the descriptions present here jemalloc post Please find the jemalloc output and the graph. > Using local file /bin/java. Using local file jeprof.57473.0.f.heap. > Total: 79372091 B 78084060 98.4% 98.4% 78084060 98.4% > je_prof_backtrace 1288031 1.6% 100.0% 1474342 1.9% > Java_java_util_zip_ZipFile_getZipMessage > 0 0.0% 100.0% 6889972 8.7% 0x00007f3d5ebac3e6 > 0 0.0% 100.0% 270421 0.3% 0x00007f3d5ebb8a79 > 0 0.0% 100.0% 727762 0

Java Object.wait(long, long) Implementation different from Documentation

こ雲淡風輕ζ 提交于 2020-01-30 08:11:49
问题 The method Object#wait(long, long) in java.lang.Object states in it's documentation that This method is similar to the wait method of one argument, but it allows finer control over the amount of time to wait for a notification before giving up. The amount of real time, measured in nanoseconds, is given by: 1000000*timeout+nanos This in itself makes sense, but the implementation does not reflect the documentation: public final void wait(long timeout, int nanos) throws InterruptedException { //

Java Object.wait(long, long) Implementation different from Documentation

 ̄綄美尐妖づ 提交于 2020-01-30 08:08:09
问题 The method Object#wait(long, long) in java.lang.Object states in it's documentation that This method is similar to the wait method of one argument, but it allows finer control over the amount of time to wait for a notification before giving up. The amount of real time, measured in nanoseconds, is given by: 1000000*timeout+nanos This in itself makes sense, but the implementation does not reflect the documentation: public final void wait(long timeout, int nanos) throws InterruptedException { //

Class文件在JVM中的执行过程

橙三吉。 提交于 2020-01-30 04:53:49
Class文件的执行: 1、Loading(加载)→2、Linking(连接)→3、Initializing (验证) 一、Loading: ClassLoader:负责载入系统的所有Resources(Class,文件,来自网络的字节流 等),通过ClassLoader从而将资源载入JVM中去运行。 JDK中很多的类加载器,但他们作用范围不同各司其职执行时也分层级(不是继承关系)!但所有的类加载器都源于ClassLoad这个抽象类。 当一个类被Loading到JVM内存后会生成java内置的Class对象,通过 Class对象 获取整个字节码文件信息并实例化对象。 ClassLoader 的等级加载机制(不是继承关系): BootstrapClassLoade ------ 是Java中最顶层的类加载器,加载JVM运行时所需要的核心类及jar包 ExtClassLoader ------拓展类及jar加载 目录:C:\Program Files\Java\jre1.8.0_201\lib\ext\xxx.jar AppClassLoader--------加载用户自定义的类(ClassPath路径)(xxxx.class→ClassLoader→CodeSegment内存中(动态加载机制) BootstrapClassLoad(c或c++制作的)加载其他ClassLoader

异常

安稳与你 提交于 2020-01-30 01:57:36
异常的简单继承关系: Exception为强制执行的异常 :不执行会报错误,如IOException、ClassNotFoundException,不解决的话会报错误。 没有执行异常的情况 : 执行的情况: RuntimeException为非强制执行的异常 :可以不执行不会报错误,如ArrayIndexOutOfBoundsException、IndexOutOfBoundsException(数组下标越界),只有当出现情况后,没有写捕捉异常的代码,JVM会使用默认方式自动报错误,终止程序运行。 不写try…cacth也没事没有出现错误直接过,只有当出现错误时才会报出错误,终止程序: JVM对于异常的处理 :当可能为错误代码,没有被try{ }catch{ }包住的时候,JVM默认报出异常和位置,然后结束程序的运行,包了但错误内没有报的错误JVM也会采取默认的方法,所以一般在最后写父类Exception保证异常都会被拦截。 异常的写法 :在方法内使用try{ 可能出现错误的代码 }catch(异常类型 e){ }finally{ }。 final:只要在final内的代码不管try…catch内有没有错误都会执行,用于IO一般写关闭流数据。 自定义异常 :自定义异常继承Exception和RuntimeException,同时也会继承相应的特性,强制执行和非强制执行。 thows

类加载机制 和垃圾回收机制

微笑、不失礼 提交于 2020-01-30 01:26:08
类加载机制 Java 分类: >JVM:虚拟机:用于将程序员写的源代码编译成可执行的class文件。 >JRE:Java的运行环境,可以执行class文件。 >JDK:Java开发的集成环境,给程序员编程用的。 >JVM小于JRE,JRE小于JDK,JKD包含JRE,JRE包括JVM 随然偏离主题 但个人觉得还是把他们说在一起 好点 做个回忆! 类的加载过程如图,再做具体的介绍。 加载 :加载是类加载的第一个阶段,通过类的全限定名来找到对应的class文件,将此class文件生成一个class对象。 这个过程主要就是类加载器完成。 链接 :链接分为3个小部分,验证、准备、解析。 验证 :验证的目的在于确保class文件的字节流中包含信息符合当前虚拟机要求,不会危害虚拟机自身安全。 主要包括四种验证 文件格式验证:基于字节流验证。 元数据验证:基于方法区的存储结构验证 字节码验证:基于方法区的存储结构验证。 符号引用验证:基于方法区的存储结构验证。 准备 :给静态方法和静态变量赋予初值,比如static int a;给其中的a赋予初值为0,但是这里不会给final修饰的静态变量赋予初值,因为被final修饰的静态变量在编译期间就已经被赋予初值了; 解析 :主要将常量池中的符号引用替换为直接引用的过程。 初始化 :类加载最后阶段,若该类具有超类,则对其进行初始化

JDK14来了:9大重磅特性解读

断了今生、忘了曾经 提交于 2020-01-30 01:25:19
作者:阿飞的博客 转载自: https://www.jianshu.com/p/0364ba3d4750 JEP 305: Pattern Matching for instanceof (Preview) JEP 358: Helpful NullPointerExceptions JEP 361: Switch Expressions (Standard) JEP 345: NUMA-Aware Memory Allocation for G1 JEP 349: JFR Event Streaming JEP 366: Deprecate the ParallelScavenge + SerialOld GC Combination JEP 363: Remove the CMS Garbage Collector JEP 364: ZGC on macOS JEP 368: Text Blocks (Second Preview) JEP 305: Pattern Matching for instanceof (Preview) 很明显这个特性跟使用instanceof有关。平常我们写代码是这样的。很明显这不是最优的方式,怎么看怎么别捏, 代码显得有点冗余乏味,我们既要类型判断,还要类型强转: if (obj instanceof String) { String s =