
JVM
淡定一生2333
这个作者很懒,什么都没留下…
展开
-
同一个电脑安装两个jdk版本
项目中分别使用到了JDK8和JDK11,需要在两个JDK之间切换,所以了解下如果在一台服务器上安装多个版本的JDK。1 . 准备两个版本的jdk我的两个jdk路径为:D:\jdk1.7.0_80D:\Program Files\Java\jdk1.8.0_1112 . 设置两个子JAVA_HOME,和一个总的JAVA_HOME共三个环境变量:JAVA_HOME7 = D:\jdk1.7.0_80JAVA_HOME8 = D:\ProgramFiles\Java\jdk...转载 2020-08-01 15:16:27 · 6805 阅读 · 3 评论 -
JVM指针压缩性能问题
当前一台个人台式机的内存都能随随便便超过4G内存,所以现在基本上大家用的都是64位的JVM。对于32位的JVM来说,对象引用(指针)的长度是32个字节,能表示的最大范围是2^32 = 4G,而对于64位的JVM来说,对象应用的长度就变成了2^64...懒得算剋以表示多大的范围了,总之来说就是64位长度的指针来说有点浪费了,平白增加了内存的使用量和GC的开销。 所以在JDK 1.6的版本后,我们在64位中的JVM中可以开启指针压缩(UseCompressedOops)来压缩我们对象指针的大小...原创 2020-05-25 21:03:41 · 1198 阅读 · 0 评论 -
记一次由RegionServer下线引起的GC调优经历
今天早上发现在跑的一个Spark任务的失败了,任务内部会涉及到高并发的查询HBase。从Spark任务的界面上来看看,是与HBase的交互出了问题,报错SocketTimeOutException。到服务器上看,发现HBase的RegionServer下线了。查看了下RegionServer的日志,发现报了如下错误org.apache.zookeeper.KeeperException$S...原创 2020-03-30 21:23:31 · 1110 阅读 · 0 评论 -
一个线程OOM之后,进程会崩溃么
偶然间看到一个问题,一个线程OOM之后,进程里面的其他线程还能运行吗?看了其他博客里面都说可以运行,但是按照项目上的经验,我们的项目是部署在tomcat中运行,如果发生OOM,这个时候发送请求是不会有回应的!所以本文打算分析一下某个线程内存溢出是,进程中的其他线程到低能否正常运行。先说下个人测试得出来的结论:OutOfMemoryError是一种错误,它是 JVM 的一种自我防御机制...原创 2019-07-27 10:51:19 · 6078 阅读 · 3 评论 -
使用visualvm远程监控Java程序
VisualVM和JConsole在监控本地JVM的时候是很方便的,只要应用程序运行起来,我们就可以连接上本地的JVM,从工具中监控JVM的情况。但是监控远程服务器上的JVM就需要进行一些额外的配置了。建立jstatd安全策略文件jstatd:Java Statistics Monitoring Daemon,是一个基于RMI的服务程序,用于监控基于HotSpot的JVM中资源...原创 2018-10-10 15:17:20 · 2461 阅读 · 0 评论 -
一次tomcat内存溢出问题的排查以及引出的dump文件分析
问题的现象: 使用DHC工具发送请求,Nginx能够正常接到请求并转发,但是tomcat中的日志一直没有打印出来,说明Nginx是正常的,是tomcat没有响应请求,说明此时tomcat处于无法访问(假死)状态。因为个人对tomcat不熟悉,所以网上找了下tomcat假死的原因,大致有如下几种:与tomcat连接未关闭/长连接数超过最大连接数Load过高,超出服务器极限...原创 2019-04-29 20:58:40 · 9561 阅读 · 0 评论 -
JVM内存结构、GC算法以及各种垃圾收集器介绍
之前有“(updated)Allocation Failure引发的一些GC知识梳理”这篇文章中简单介绍过GC相关的一些知识点,但是总结的并不是很全面,本片文章希望能尽量详细分析下JVM内存结构、GC算法以及各种垃圾收集器介绍。JVM内存结构如下:主要包括了下面几个部分:程序计数器(线程私有)存放着当前线程所执行的字节码的行号指示器栈(线程私有)每个方法被执行...原创 2019-01-26 11:04:53 · 1227 阅读 · 0 评论 -
synchronize底层实现原理以及相关的优化
首先来说下synchronize和Lock的区别:两者都是锁,用来控制并发冲突,区别在于Lock是个接口,提供的功能更加丰富,除了这个外,他们还有如下区别:synchronize自动释放锁,而Lock必须手动释放,并且代码中出现异常会导致unlock代码不执行,所以Lock一般在Finally中释放,而synchronize释放锁是由JVM自动执行的。 Lock有共享锁的概念,所以可以设...原创 2018-12-03 22:08:22 · 31418 阅读 · 3 评论 -
JVM是如何实现方法调用的
JVM是如何识别到低该调用哪个方法的:JVM是根据 类名+方法名+方法描述符(形参+返回类型) 来识别到底该调用哪一个方法的。其中,重载方法的匹配优先级规则如下(Java中的重载不会根据返回类型来区分):优先调用非自动装拆箱的 在1不行的情况下,允许自动装箱 在2也不行的情况下,允许可变长参数 按照绑定类型分,可以将方法分为静态绑定和动态绑定两种:其中,绑定是指将一个方法...原创 2018-11-10 23:48:57 · 3377 阅读 · 0 评论 -
JVM运行程序说明以及类加载机制
与C和C++等语言不同,C和C++是通过编译器直接将代码编译成CPU能理解的代码格式,即机器码,然后执行。Java为了实现跨平台运行,是将程序编程成Java字节码,将字节码交给JVM来运行,这样做的好处不仅是实现了跨平台,同时JVM还会提供一个Managed Runtime(托管环境),这个东东能够帮助我们处理自动内存管理、GC、数组越界、安全权限等检测,避免我们写这些无关业务逻辑的代码。...原创 2018-11-10 23:44:29 · 1578 阅读 · 0 评论 -
Java内存模型个人理解
个人理解Java并发问题主要有两个:线程间如何通信 变量如何共享针对第一个问题,Java使用共享内存来进行线程间通信,因为这种方式速度最快.而对于后一个问题则是用锁. 为了解决以上的并发问题并且保障跨平台行,Java定义了自己的内存模型.内存模型描述了程序中各个变量之间的关系,以及操作系统将变量存储到内存以及从内存中取出变量这样的细节.此处的变量不包括局部变量与方...原创 2018-08-11 17:26:59 · 224 阅读 · 0 评论 -
GC(Allocation Failure)引发的一些JVM知识点梳理
日前查看某个程序的日志,发现一直在报GC相关的信息,不确定这样的信息是代表正确还是不正确,所以正好借此机会再复习下GC相关的内容:以其中一行为例来解读下日志信息:[GC (Allocation Failure) [ParNew: 367523K->1293K(410432K), 0.0023988 secs] 522739K->156516K(1322496K), 0.0025...原创 2018-10-12 17:08:51 · 146963 阅读 · 14 评论