JVM

Stella981
• 阅读 767

   最近又鼓捣jvm,然后结合着VisualVM监控、jvm的书,对jvm又有一些理解体会,今天主要聊聊jvm的线程模型,内存模型,以及跟开发比较相关的GC。

   线程模型,jvm的线程就对应os的线程,据说linux的kernel3.x之后,也出现了OS内核线程支持,之前实现是轻量级进程,比如你线程搞多了,或者kernel内存留少了,unable to create new native thread。
   内存模型,类似多核cpu的高速缓存,跟主内存的关系,jvm是线程栈与主内存,于是只要线程共享的栈内变量,就得加volatile,那个内存屏障、#lock信号量就不说了,你在jdk的Concurrent常见volatile的。
   来张图:
JVM

   内存管理,算是最常见的方面,首先分代收集,即新生代、老年代、永久代,你可以设置分代的大小比例,当然G1是region划分的;
   然后收集算法,1. 新生代标记复制,eden\s0\s1,默认8:1:1的比例,关于晋升老年代,也可以设置对象年龄,总之减少FullGC的次数;2. 老年代标记整理,SerialOld、ParOld、ParallelOld都是这个算法,但是CMS收集器是标记清除;3. 分区收集,分为不同region独立回收,就是garbageFrist的G1收集器。
   最后收集器,一般多核cpu应用并发的收集器,关于stop-world问题,可以设置收集时间,收集比例等进行控制;当然CMS、G1收集器会把并发标记、并发清理跟初始标记、重新标记分开,响应时间上会比其他的收集器要好。
  来张图:
JVM

   对于垃圾收集器的参数配置,其实还是跟算法紧密相关的,现在cpu都多核,一般都选用并行收集器,图上除了Serial的;
   xms、xmx:一般设为一样大,扩充堆大小也得有不小开销,当然一般系统都会预热; 
   当然,OS运行也是要内存的,别把OS的内存挤掉了.
   xmn:产生的对象朝生夕灭就多设置点,否则就反过来嘛;
   survivorratio:晋升老年代有个担保分配,为减少FullGC,根据应用监控调节;
   metaspacesize:jdk1.8把常量池啥的都迁移出去了,存储类加载器&类信息;
   parallelGCThreads:并行收集线程数,如果cpu富裕就加点呗;
   maxTenuringThreshold:对象晋升老年代的年龄,如果朝生夕灭就多设置点;
   pretenureSizeThreshold:大对象晋升老年代,详情请Google;
   useAdaptiveSizePolicy:动态调整晋升年龄及大小,这个参数好啊;
   当然各个收集器有自己的参数,比如maxGCPauseMillis、CMSInitiatingOccupancyFraction等。

   至于字节码引擎执行、字节码的提前编译,表示还没咋接触。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Wesley13 Wesley13
3年前
Java运行状态分析2:获取线程状态及堆栈信息
Java运行状态分析2:线程状态及堆栈信息基本概念出现内存泄漏或者运行缓慢场景,有时候无法直接从业务日志看出问题时候,需要分析jvm内存和线程堆栈线程堆栈信息主要记录jvm线程在某时刻线程执行情况,分析线程状态可以跟踪到程序出问题的地方​内存堆栈信息主要记录jvm堆中在某时刻对象使用情况,
Wesley13 Wesley13
3年前
JAVA多线程的学习笔记
第一次在开源中国上发博文,简单的把以前在达内培训JAVA时的一篇日志复制共享一下。多进程(多任务)-针对OS多线程(Thread)-一个进程内部的多任务java语言(JVM)支持多线程编程java.lang.ThreadThread类由JDK提供,用于封装对JVM中线程的控制,调用C语言的类库实现。1、创
Wesley13 Wesley13
3年前
Java8内存模型
<divclass"htmledit\_views"<h1<aname"t0"</a一、JVM内存模型</h1<p</p<p<spanstyle"fontfamily:'宋体';"内存空间</span(RuntimeDataArea)中可以按照是否线程共享分为两块,线程共享的是方法区(MethodArea)和堆
Wesley13 Wesley13
3年前
Java多线程之内存可见性
Java多线程之内存可见性一、Java内存模型介绍什么是JMM?Java内存模型(JavaMemoryModel)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取出变量这样的细节所有的变量都存储在主内存中每个线程都
Wesley13 Wesley13
3年前
Java线程与多线程
1线程与多线程1.1线程是什么?线程(Thread)是一个对象(Object)。用来干什么?Java线程(也称JVM线程)是Java进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。Java程序采用多线程方式来支持大量的并发请求处理,程序如果在
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
待兔 待兔
5个月前
Java内存的可见性
Java内存的可见性可见性:一个线程对共享变量的修改,能够及时被其它线程看到共享变量:如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量Java内存模型(JMM):描述了Java程序中各种线程共享变量的访问规则,以及在JVM