
JVM
江上渔者21号
这个作者很懒,什么都没留下…
展开
-
Java并发编程:synchronized和锁优化
1. 使用方法synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面:确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保证共享变量的修改能及时可见 有效解决重排序问题语义上来讲,synchronized主要有三种用法:修饰普通方法,锁的是当前对象实例(this) 修饰静态方法,锁的是当前 Class 对...转载 2019-03-10 11:22:18 · 107 阅读 · 0 评论 -
从 synchronized 到 CAS 和 AQS - 彻底弄懂 Java 各种并发锁
概述Java 中的并发锁大致分为隐式锁和显式锁两种。隐式锁就是我们最常使用的 synchronized 关键字,显式锁主要包含两个接口:Lock 和 ReadWriteLock,主要实现类分别为 ReentrantLock 和 ReentrantReadWriteLock,这两个类都是基于 AQS(AbstractQueuedSynchronizer) 实现的。还有的地方将 CAS 也称为一种...转载 2019-01-22 10:23:03 · 4355 阅读 · 0 评论 -
volatile 的内部如何实现的
反汇编Java字节码,查看汇编层面对volatile关键字做了什么有了上面的理论基础,我们可以研究volatile关键字到底是如何实现的。首先写一段简单的代码: 1 /** 2 * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7048693.html 3 */ 4 public class LazySingleton { 5 ...转载 2019-01-22 08:45:51 · 418 阅读 · 1 评论 -
happens-before
3.有序性 在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。 在Java里面,可以通过volatile关键字来保证一定的“有序性”(具体原理在下一节讲述)。另外可以通过synchronized和Lock来保证有序性,很显然,synchronized和Lock保证每个时刻是有一个线程执行同步代码,相当于...转载 2019-01-22 08:35:18 · 154 阅读 · 0 评论 -
GC详解及Minor GC和Full GC触发条件总结
GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用。即:从gcroot开始,把所有可以搜索得到的对象标记为存活对象。GC机制要准确理解Java的垃圾回收机制,就要从:“什么时候”,“对什么东西”,“做了什么”三个方面来具体分析。第一:“什么时候”即就是GC触发的...转载 2019-03-26 21:42:19 · 258 阅读 · 0 评论 -
synchronized 关键字原理
synchronized 关键字原理众所周知 synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式:同步普通方法,锁的是当前对象。 同步静态方法,锁的是当前 Class 对象。 同步块,锁的是 () 中的对象。实现原理: JVM 是通过进入、退出对象监视器( Monitor )来实现对方法、同步块的同步的。具体实现是在编译之后在同步方法调用前加入一个 m...转载 2019-01-15 08:35:46 · 92 阅读 · 0 评论 -
jvm 中的参数
我们前面说了很多原理,现在我们就开始实战,说一下JVM的调优参数:一般情况JVM调优参数如下:set JAVA_OPTS=-server -Xms1400M -Xmx1400M -Xmn768M -Xss128k -XX:PermSize=256M -XX:MaxPermSize=256M -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -X...转载 2018-12-30 17:44:50 · 388 阅读 · 0 评论 -
java idea如何线上debug
1 建立一个remote 项目2 ip 填入远程的机器 3 端口进行查看 ,catalina.sh 4 选择自己的模块; 下面表示成功 参数解释-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8787 dt_socket:使用的通信方式s...原创 2018-12-05 10:27:30 · 2436 阅读 · 0 评论 -
java full gc coredump visualVm分析出对应的未释放的对象
1 首先要了解在java、jvm中 什么是内存泄漏的问题,下面的一张图帮助你理解2 主要分析出 大对象的引用 就可以了(可以自己想象成 c++ 中类似指针和引用);然后在程序中找出对应的对象,分析出为什么没有掉入到 jvm回收池子中 ...原创 2018-11-23 12:48:49 · 413 阅读 · 0 评论 -
使用VisualVM查看Java Heap Dump
使用了jmap工具实现,手工触发fullGC,运维常备 jmap -histo:live <pid>或者jmap -dump:live,file=dump_001.bin PID 会生成dump_001.bin文件浏览Heap Dump可以使用VisualVM浏览heap dump文件的内容,从而快速查看在堆中分配的对象。Heap dumps在主窗口的...翻译 2018-11-17 19:06:36 · 6579 阅读 · 0 评论 -
jvm 的启动参数
java启动参数共分为三类;其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用; 一.标准参数 -client 设置jvm使用clien...转载 2018-09-30 17:01:38 · 179 阅读 · 0 评论 -
JAVA启动参数大全之三:非Stable参数
前面我们提到用-XX作为前缀的参数列表在jvm中可能是不健壮的,SUN也不推荐使用,后续可能会在没有通知的情况下就直接取消了;但是由于这些参数中的确有很多是对我们很有用的,比如我们经常会见到的-XX:PermSize、-XX:MaxPermSize等等;下面我们将就Java HotSpot VM中-XX:的可配置参数列表进行描述;这些参数可以被松散的聚合成三类:行为参数(Behaviora...转载 2018-09-30 16:52:06 · 218 阅读 · 0 评论 -
Java方法区和永久代
目前有三大Java虚拟机:HotSpot,oracle JRockit,IBM J9。JRockit是oracle发明的,用于其WebLogic服务器,IBM JVM是IBM发明的用于其Websphere服务器(所以在某行开发的时候,他们用的是IBM的JDK,因为他们使用的IBM的应用程序服务器Websphere,使用其他JDK可能存在兼容性问题)。JRockit和J9不存在永久代这种说法...转载 2019-03-08 00:09:56 · 3426 阅读 · 0 评论 -
JVM中的直接引用和符号引用
在JVM中,类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。而解析阶段即是虚拟机将常量池内的符号引用替换为直接引用的过程。1.符号引用(Symbolic References):符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Class文件中它以CONSTA...转载 2019-03-07 23:55:56 · 149 阅读 · 0 评论 -
什么是java OOM?如何分析及解决oom问题?
最近查找了很多关于OOM,甚至于Java内存管理以及JVM的相关资料,发现这方面的东西太多了,竟有一种眼花缭乱的感觉,要想了解全面的话,恐非一篇文章能说清的,因此按照自己的理解整理了一篇,剩下的还需要继续学习。1)什么是OOM?OOM,全称“Out Of Memory”,翻译成中文就是“内存用完了”,来源于java.lang.OutOfMemoryError。看下关于的官方说明:Throw...转载 2019-03-23 12:23:58 · 160 阅读 · 0 评论 -
74 Java 对象在内存中状态
转载 2019-03-23 12:09:32 · 233 阅读 · 0 评论 -
JAVA中类、实例与Class对象
类 类是面向对象编程语言的一个重要概念,它是对一项事物的抽象概括,可以包含该事物的一些属性定义,以及操作属性的方法。面向对象编程中,我们都是以类来编码。实例简单理解,就是new,就是对类的实例化,创建这个类对应的实际对象,类只是对事物的描述,而实例化就相当于为这个描述新开辟了一块内存,可以改变这块区域里的各种属性(成员变量),当然,也可以实例化多块区域,只是不同的对象而...转载 2019-03-22 14:29:41 · 2084 阅读 · 0 评论 -
java 中定位高cpu的线程
(3)定位 CPU 高的线程打印其 nid查看线程下具体进程信息的命令如下:top -H -p 6735top - 14:20:09 up 611 days, 2:56, 1 user, load average: 13.19, 7.76, 7.82Threads: 6991 total, 17 running, 6974 sleeping, 0 stopped, ...转载 2019-03-18 09:01:49 · 574 阅读 · 0 评论 -
Java GC、新生代、老年代、gc日志分析
1、堆内存Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。...转载 2019-03-08 00:10:51 · 880 阅读 · 0 评论 -
如何选择合适的 GC 时间 —— USER, SYS, REAL理解
在 GC 日志文件中,每个 GC 事件有三种类型的时间: user sys real 例如:[Times: user=11.53 sys=1.38, real=1.03 secs].在我们开始分析 GC 日志的时候,会遇到两个问题:1、user、sys和real三者之间有什么不同?2、我们该使用哪一个时间来分析日志?Unix 的 Time...转载 2019-03-07 23:43:43 · 3349 阅读 · 0 评论 -
Java 自定义 ClassLoader 实现 JVM 类加载
定义需要加载的类为了能够实现类加载,并展示效果,定义一个Hello类,再为其定义一个sayHello()方法,加载Hello类之后,调用它的sayHello()方法。public class Hello { public static void sayHello(){ System.out.println("Hello,I am ...."); }}...转载 2019-03-10 20:34:06 · 265 阅读 · 0 评论 -
类加载发生的时机是什么时候?
虚拟机严格规定,有且仅有 5 种情况必须对类进行加载:注意,有些文章会称为对类进行“初始化”。1、遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没进行初始化,则需要先触发其初始化。 2、使用java.lang.reflect包的方法对类进行反射调用的时候,如果类还没进行初始化,则需要先触发其初始化。 3、当初始化了一...转载 2019-03-10 17:35:45 · 1323 阅读 · 0 评论 -
触发JVM进行Full GC的情况及应对策略
堆内存划分为 Eden、Survivor 和 Tenured/Old 空间,如下图所示:从年轻代空间(包括 Eden 和 Survivor 区域)回收内存被称为 Minor GC,对老年代GC称为Major GC,而Full GC是对整个堆来说的,在最近几个版本的JDK里默认包括了对永生带即方法区的回收(JDK8中无永生带了),出现Full GC的时候经常伴随至少一次的Minor GC,但...转载 2019-03-10 17:31:06 · 122 阅读 · 0 评论 -
JAVA启动参数大全之二:非标准参数
非标准参数又称为扩展参数,其列表如下:-Xint 设置jvm以解释模式运行,所有的字节码将被直接执行,而不会编译成本地码。 -Xbatch 关闭后台代码编译,强制在前台编译,编译完成之后才能进行代码执行; 默认情况下,jvm在后台进行编译,若没有编译完成,则前台运行代码时以解释模式运行。 -Xbootclasspath:bootclasspath 让jvm从指定路径(可以是分号分隔的目...转载 2018-09-30 16:50:01 · 302 阅读 · 0 评论 -
AVA启动参数大全之一:标准参数
前段时间系统升级时遭遇了OOM,具体解决过程见 遭遇OutOfMemoryError;为了巩固对于java启动各项参数的认识,决定将所有参数列举出来,并一一解释,以便后查;java启动参数共分为三类;其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容;其...转载 2018-09-30 16:48:03 · 386 阅读 · 0 评论 -
JVM初窥:Java对象的内存结构
对象内存结构Class文件以字节码的形式存储在方法区当中,用来描述一个类本身的内存结构。当使用Class文件新建对象时,对象实例的内存结构又究竟是个什么样子呢? 如图所示,为了表示对象的属性、方法等信息,HotSpot VM使用对象头部的一个指针指向Class区域的方式来找到对象的Class描述,以及内部的方法、属性入口。除此之外,还在对象的头部划分了部分空间(Mark Word),用于描...转载 2018-10-13 09:47:56 · 142 阅读 · 0 评论 -
锁 对象头Mark
MarkWord,对象头的标记,32位描述对象的hash、锁信息,垃圾回收标记,年龄–指向锁记录的指针–指向monitor的指针–GC标记–偏向锁线程ID偏向锁大部分情况是没有竞争的,所以可以通过偏向来提高性能所谓的偏向,就是偏心,即锁会偏向于当前已经占有锁的线程将对象头Mark的标记设置为偏向,并将线程ID写入对象头Mark只要没有竞争,获得偏向锁的线程,在将来进入同步块,不需要做同步当其他线程...原创 2018-06-24 14:37:13 · 559 阅读 · 0 评论 -
锁
线程安全package metux;import java.util.ArrayList;import java.util.List;/** * @Package Name : ${PACKAG_NAME} * @Author : dongfucai@meituan.com * @Creation Date : 2018年06月23日下午5:31 * @Function : to...原创 2018-06-23 20:03:36 · 208 阅读 · 0 评论 -
类装载器
class 装载的流程1 加载2 链接 验证 准备 解析3 初始化解析 地址的解析累的 初始化原创 2018-06-13 10:13:31 · 116 阅读 · 0 评论 -
Java中volatile关键字实现原理
作者:知乎用户链接:https://www.zhihu.com/question/49656589/answer/117826278来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。volatile 只能保证 “可见性”,不能保证 “原子性”。count++; 这条语句由3条指令组成:(1)将 count 的值从内存加载到 cpu 的某个寄存器r(...转载 2018-05-29 14:13:25 · 1764 阅读 · 0 评论 -
CMS 收集器
系统的性能和吞吐量息息相关的cpu是分到了 应用程序还是gccpu分到应用程序中 越多 吞吐量越高,比如一个网站,很多用户请求。CMS 收集器conccurrent Mark Sweep 并发的标记清除标记清除算法垃圾回收期与 应用程序交替执行。停顿时间少停顿减少了, 并发阶段会降低吞吐量减少它是一个老年代的 收集器(新生代采用 ParNew)-XX:+UseConCMarkSweepGC初始标...原创 2018-06-12 00:38:52 · 308 阅读 · 0 评论 -
gc的参数
串行收集器并行收集器CMS收集器eden s0 s1 tenured from to绝大多数都是在 eden区 但也有 栈区 和 old区s0 和 s1 大小相等 功能上也是对称的,复制算法串行收集器最古老 ,最稳定效率高但是可能会较长时间停顿 因为 只使用一个线程回收-XX:UseSerialGC -- 新生代、老年代使用串行回收 -- 新生代 复制算法 -- 老...原创 2018-06-05 00:22:30 · 340 阅读 · 0 评论 -
分代思想
根据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代根据不同代的特点,寻取合适的收集算法 少量对象存活,适合复制算法。 比如新生代 大量对象存活,适合标记清理或者标记压缩算法。不如老年代 1 担保 2 多次回收后进入的因此老年代会有大量的对象存活可触及 可复活 不可触及的...原创 2018-06-03 00:48:06 · 204 阅读 · 0 评论 -
复制算法
与标记-清除算法相比,复制算法是一种相对高效的回收算法。不适合于存活对象较多的场合 如老年代。思想:将原有的内存空间分为两块,每次只使用其中的一块,在垃圾回收时候,将正在使用的内存中的存活对象复制到为未使用的内存中,清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收。复制算法完成后,第一块使用的那块内存完成清除,不管它存活还是未存活。都将它清理。复制算法对空间有一定的浪费。只能使用...原创 2018-06-03 00:39:00 · 2063 阅读 · 0 评论 -
标记-压缩方法
标记-压缩算法适用于存活对象比较多的场合,如老年代。它在标记-清除算法的基础上坐了一些优化。和标记-清除算法一样,标记-压缩算法也是首先从根结点开始,对所有可以达到的对象进行一次标记。但之后,它并是要简单但清理未被标记的对象,而是将所有存活的对象压缩到内存的一端。之后,清理所有边界外的空间。找出标记的对席后,开始移动存活对象,不是清除未标记的对象。移动完后 ,清理边界外的对象。标记压缩相对...原创 2018-06-02 22:04:32 · 1341 阅读 · 0 评论 -
标记-清除方法
标记清除算法是现代垃圾回收的算法思想的基础。标记-清除将垃圾回收分为了两个阶段:标记阶段和清除阶段。一种可行的实现是,在标记阶段,通过根结点,标记出从根结点开始的可以到达对象。为能够被标记的为垃圾对象。然后在清除的阶段,清除未能够标记的对象。如下图...原创 2018-06-02 21:41:21 · 1944 阅读 · 0 评论 -
GC算法和种类
gc的概念Garbage Collection 垃圾收集 后台有一个垃圾回收的线程,不断的扫描1960年 List使用了GCjava中 GC的对象是堆空间和永久区-----------------------------------引用计数的思想---------------------------------标记-清除方法...原创 2018-05-16 13:11:30 · 116 阅读 · 0 评论 -
常用的jvm配置参数 :永久区参数配置
一开始java程序起来了 PermSize 大小如果不够的话,MaxPermSize 为最大的情况。如果超过了就会oom永久区表达能够容纳多少个类型,一般来讲不大,几十兆到几百兆-----------------------------------------------栈表示线程私有的。每个线程都会有的,不会很大。--------------栈空间的大小的分配溢出...原创 2018-05-15 00:24:46 · 596 阅读 · 0 评论 -
常用的jvm配置参数 :堆的参数配置
-Xmx 指定最大堆 java虚拟机最多能够使用多少堆空间-Xms 指定最小堆 至少使用多少空间,只要java虚拟机启动 ,这么多空间就会被占用当申请一个1M的空间后java会尽可能在维持在最小堆中运行------------------------------------再去分配4M的空间,就会扩容---------------------------------------------...原创 2018-05-11 10:14:58 · 1312 阅读 · 0 评论 -
JVM的年轻代
1.为什么会有年轻代我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能。你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我们要找到哪些对象没用,这样就会对堆的所有区域进行扫描。而我们的很多对象都是朝生夕死的,如果分代的话,我们把新创建的对象放到某一地方,当GC的时候先把这块存“朝生夕死”对象的区域进行回收,这样就会腾出很大...转载 2018-05-10 20:31:24 · 193 阅读 · 0 评论