jvm(Hotspot)
jvm 原理
lxlmycsdnfree
脑科学爱好者,物理爱好者,计算机从业者
展开
-
A fatal error has been detected by the Java Runtime Environment:SIGSEGV
printLoggerForShoppingCartRsf## A fatal error has been detected by the Java Runtime Environment:## SIGSEGV (0xb) at pc=0x00007fd1580d7ec6, pid=20740, tid=140537093121792## JRE version: 6.0_45-b原创 2017-10-29 14:20:34 · 3460 阅读 · 1 评论 -
JVM调优总结(三)-基本垃圾回收算法
可以从不同的的角度去划分垃圾回收算法:按照基本回收策略分引用计数(ReferenceCounting):比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。 标记-清除(Mark-Sweep): 此算法执行分两阶段。第一阶段从引用根节点开始标转载 2017-04-27 11:08:18 · 322 阅读 · 2 评论 -
JVM调优总结(一)
数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress引用转载 2017-04-27 10:59:40 · 224 阅读 · 2 评论 -
jvm 种类
Wikipedia那个Comparison of Java virtual machines页面给JVM实现分得还挺细。Java SE / Java EEJava EE是以Java SE为基础的。所以并没有“JVM for Java EE”这么一说,只有“JVM for Java SE”,可以用于Java SE与Java EE。在这个类别下,主流选择有:(按流行程度递减原创 2017-04-05 19:01:01 · 3847 阅读 · 1 评论 -
几种jvm OOM问题
在《Java虚拟机简单介绍》中就介绍过Java jvm内存划分,今天就具体的划分区域编写简单outMemery程序:1.堆溢出直接创建极大的对象数组就可以:原创 2017-03-24 20:40:24 · 1412 阅读 · 0 评论 -
Java虚拟机简单介绍
安装jdk之后一般都会安装jre,在jre中就包含有Java虚拟机(jvm).jvm是虚拟出来的,类似于简单的系统,有自己的内存管理,寄存器,程序计数器cp,环境指针和栈指针等。1.先说Java虚拟机的内存管理 (1)寄存器 JVM只设置了4个最为常用的寄存器。它们是: pc程序计数器,用于记录程序的执行。 optop操作数栈顶指针 ,记录指向Java栈区的指针。 fr...原创 2017-03-03 11:50:33 · 712 阅读 · 0 评论 -
JVM相关问题
问:堆和栈有什么区别答:堆是存放对象的,但是对象内的临时变量是存在栈内存中,如例子中的methodVar是在运行期存放到栈中的。栈是跟随线程的,有线程就有栈,堆是跟随JVM的,有JVM就有堆内存。 问:堆内存中到底存在着什么东西?答:对象,包括对象变量以及对象方法。 问:类变量和实例变量有什么区别?答:静态变量是类变量,非静态变量是实例变量,直白的说,有static转载 2017-04-27 14:27:15 · 188 阅读 · 0 评论 -
JVM源码分析之javaagent原理完全解读
转载地址:https://yq.aliyun.com/articles/2946?spm=5176.100239.yqblog1.45摘要: 前言 本系列文章都是基于Hotspot/JDK源码,从源码角度来分析我们常见的JVM参数,Java概念以及对应的实现原理及玩法等,希望从根本上来理清Java知识点,我们会不定期地分享这个系列的文章,这些文章可能源于最近碰到的问题,也可能是同学们的提问转载 2018-01-10 14:24:29 · 340 阅读 · 0 评论 -
JVM Attach机制实现
Attach是什么 在讲这个之前,我们先来点大家都知道的东西,当我们感觉线程一直卡在某个地方,想知道卡在哪里,首先想到的是进行线程dump,而常用的命令是jstack ,我们就可以看到如下线程栈了2014-06-18 12:56:14Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode):转载 2018-01-10 12:00:12 · 433 阅读 · 0 评论 -
JVMTM Tool Interface
JVMTM Tool Interface 地址:https://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html#ClassFileLoadHook这个文档提供给我们jvm在初始化,加载运行整个过程中(类加载,方法执行,线程过程,内存过程等等),每一步提供给我们对应的JNI通知接口。这套JNI是以事件为驱动的,让我们在jvm的每一个原创 2018-01-10 15:07:44 · 313 阅读 · 0 评论 -
jvm 大对象持久存活,不让其进入老年区的方法
[root@ ~]# jmap -heap 20416Attaching to process ID 20416, please wait...Debugger attached successfully.Server compiler detected.JVM version is 24.75-b04using thread-local object allocation.Para...原创 2018-02-23 10:16:18 · 2299 阅读 · 0 评论 -
查看自己设置的jvm参数
一行命令获取当前JVM所有可设置的参数以及当前默认值java -XX:+PrintFlagsInitial >>1.txt或者执行 linux shell : ps -ef | grep java 即可原创 2018-05-02 11:22:30 · 5363 阅读 · 0 评论 -
jvm classLoader 过程
1、加载(一般人所熟悉的双亲委托模型,这只是一个过程) 类的加载阶段,主要是获取定义此类的二进制字节流,并将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构,最后在Java堆中生成一个代表这个类的java.lang.Class对象作为方法区这些数据的访问入口。相对于类加载过程的其他阶段,加载阶段是开发期可控性最强的阶段。我们可以通过定制不通的类加载器,也就是ClassLoader...原创 2018-05-02 21:20:23 · 130 阅读 · 0 评论 -
Hotspot GC Root 对应调用链
GC RootGC Root全称是garbage collection root, 即垃圾回收的根. 回到我们的葡萄比喻上来, 也就是一串葡萄的柄. 实际上JVM中的GC Root不只一个, 也就是多个这样的 “柄”. 来看看hotspot网站的解释:garbage collection rootA pointer into the Java object heap from...原创 2018-07-11 21:12:21 · 1002 阅读 · 0 评论 -
hotspot1.6 synchronizer.cpp源码 以及生成hashcode代码
/* * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistrib...原创 2018-04-02 16:20:37 · 897 阅读 · 1 评论 -
openjdk(HOTSPOT)垃圾回收源码解读
代码位置:gc_interface 接口和gc_implementation这是jdk1.7 几种垃圾回收器先看公共接口类中的 代码:collectedHeap.cpp/* * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIG...原创 2018-07-15 16:10:22 · 3144 阅读 · 1 评论 -
JVM调优总结(四)-垃圾回收面临的问题
如何区分垃圾 上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的。上面分析的堆和栈的区别,其中栈是真正进行转载 2017-04-27 11:11:02 · 199 阅读 · 0 评论 -
JVM调优总结(八)-典型配置举例2
常见配置汇总 堆设置 -Xms:初始堆大小 -Xmx:最大堆大小 -XX:NewSize=n:设置年轻代大小 -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有转载 2017-04-27 11:27:00 · 216 阅读 · 0 评论 -
JVM调优之jstack找出最耗cpu的线程并定位代码
jstack可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。下面我们来一个实例找出某个Java进程中最耗费CPU的Java线程并定位堆栈信息,用到的命令有ps、top、printf、jstack、grep。第一步先找出Java进程ID,服务器上的Java应用名称为mrf-center:root@ubuntu:/# ps -ef | grep原创 2017-09-06 19:32:45 · 1070 阅读 · 0 评论 -
Java虚拟机和Dalvik(android)虚拟机的区别
首先你必须对java虚拟机中常用的一款有深入的了解,比如Hotspot。然后你再了解下android系统和Dalvik。Dalvik 与 传统jvm的差别还是很大的,总结来说,我个人把其归纳为三大类:(1).传统jvm是基于栈的,而Dalvik基于寄存器的。如果你了解Hotspot,你发现每一个方法对应栈帧,每一条指令都是基于栈的操作,基于栈,那么很多都是进栈和出栈的造作,那么造就原创 2017-07-04 16:38:56 · 781 阅读 · 0 评论 -
Minor GC,Major GC,Full GC -- hotspot VM GC讲解
针对HotSpot VM的实现,它里面的GC其实准确分类只有两大种:Partial GC:并不收集整个GC堆的模式Young GC:只收集young gen的GCOld GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式Full GC:收集整个堆,包括youn...原创 2017-06-22 11:51:51 · 542 阅读 · 0 评论 -
JVM调优总结(六)-分代垃圾回收详述2
分代垃圾回收流程示意 选择合适的垃圾收集算法串行收集器 用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高。但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器。当然,此收集器也可以用在小数据量(100M左右)情况下的多处理器机器上。可以使用-XX:+UseSerialGC打开。 并行收集器转载 2017-04-27 11:25:48 · 217 阅读 · 0 评论 -
JVM调优总结(五)-分代垃圾回收详述1
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。 在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程转载 2017-04-27 11:13:58 · 158 阅读 · 0 评论 -
JVM调优总结(二)
Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。 在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:Objectob = new Object(); 这样在程序中完成了一个Java对象的生命,但是它所占的空间为:4byte+8byte转载 2017-04-27 11:02:33 · 227 阅读 · 2 评论 -
jvm 常用调试工具和设置jvm GC方法和指令
JVM常用调试工具:jconsole – jconsole是基于JavaManagementExtensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。Linux下设置环境变量如下:export DISPLAY=:0.0j原创 2017-03-28 23:42:09 · 5661 阅读 · 0 评论 -
bundle传递对象与Serializable、Parcelable接口理解和思考
bundle.putSerializable 或者 bundle.putParcelable 传进去的对象一定要implements Parcelable 或者 Serializable 这两个接口。Serializable 这个接口没有具体的方法,这个关键字主要是标识这个类在jdk编译的时候会被序列化处理。在序列化处理的过程中,会大量生成中间临时变量。可能引起GC操作。对于Parc原创 2017-03-23 14:04:54 · 2808 阅读 · 0 评论 -
JVM源码分析之synchronized实现
java内部锁synchronized的出现,为多线程的并发执行提供了一个稳定的环境,有效的防止多个线程同时执行同一个逻辑,其实这篇文章应该写在深入分析Object.wait/notify实现机制之前,本文不会讲如何使用synchronized,以HotSpot1.7的虚拟机为例,对synchronized的实现进行深入分析。synchronized的HotSpot实现依赖于对象头的Mark转载 2017-09-29 17:56:49 · 590 阅读 · 0 评论 -
对 cas 操作的理解
cas官方说明:Compare and Swap,比较并操作,CPU指令,在大多数处理器架构,包括IA32、Space中采用的都是CAS指令,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告原创 2017-09-25 15:04:10 · 730 阅读 · 0 评论 -
jvm 并发原理
jvm 实现多线程,本质上是调用所在平台系统的接口创建多线程或者多进程。比如windows上,jvm调用_beginthreadex创建线程,这是内核线程。对于Linux,Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。其和核心线程一一对应,但也算是内核线程。 因为是内核线程直接提供支持和对应创建,销毁。原创 2017-07-06 11:28:25 · 1026 阅读 · 0 评论 -
慢慢琢磨JVM
1 JVM简介JVM是我们Javaer的最基本功底了,刚开始学Java的时候,一般都是从“Hello World”开始的,然后会写个复杂点class,然后再找一些开源框架,比如Spring,Hibernate等等,再然后就开发企业级的应用,比如网站、企业内部应用、实时交易系统等等,直到某一天突然发现做的系统咋就这么慢呢,而且时不时还来个内存溢出什么的,今天是交易系统报了StackOverf转载 2017-04-27 14:25:47 · 269 阅读 · 0 评论 -
JVM调优总结(十一)JVM 几个重要的参数
最近对JVM的参数重新看了下, 把应用的JVM参数调整了下。 几个重要的参数-server -Xmx3g -Xms3g -XX:MaxPermSize=128m -XX:NewRatio=1 eden/old 的比例-XX:SurvivorRatio=8 s/e的比例 -XX:+UseParallelGC -XX:ParallelGCThreads=8 -XX:转载 2017-04-27 13:52:30 · 1026 阅读 · 0 评论 -
JVM调优总结(九)-新一代的垃圾回收算法
垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限。但是他无法解决的一个问题,就是FullGC所带来的应用暂停。在一些对实时性要求很高的应用场景下,GC暂停所带来的请求堆积和请求失败是无法接受的。这类应用可能要求请求的返回时间在几百甚至几十毫秒以内,如果分代垃圾回收方式要达到这个指标,只能把最大堆的设置限制在一个相对转载 2017-04-27 11:29:18 · 295 阅读 · 0 评论 -
JVM调优总结(七)-典型配置举例1
以下配置主要针对分代垃圾回收算法而言。 堆大小设置年轻代的设置很关键JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。在WindowsServer 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为147转载 2017-04-27 11:15:54 · 194 阅读 · 0 评论 -
-XX:+UseParallelGC与 -XX:+UseParNewGC相关介绍
首先看一个图(所有的垃圾回收器,以及工作的堆空间)对于我们默认(jdk1.7)使用parallel 垃圾回收器,old区就是使用的是parallel old, yong区使用的是parallel Scavenge使用-XX:+UseParallelGC与 -XX:+UseParNewGC设置的区别在于:--------------------------------------...原创 2018-08-09 10:09:39 · 36819 阅读 · 0 评论