JVM-详解

news/2024/7/20 15:35:53 标签: java, 内存管理

为什么80%的码农都做不了架构师?>>>   hot3.png

   最近又鼓捣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的。
   来张图:


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


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

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

转载于:https://my.oschina.net/lobo/blog/847936


http://www.niftyadmin.cn/n/1624644.html

相关文章

kali 2020最新源

11182020KALI源 1.更新软件源 sudo vim /etc/apt/sources.list 2.选择比较合适的源(选择一个即可) #中科大 deb http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib deb-src http://mirrors.ustc.edu.cn/kali kali-rolling main non-free contrib…

mysql 命令行导入导出.sql文件

window下 1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u dbuser -p dbname > dbname.sql2.导出一个表mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名mysqldump -u dbuser -p dbname users> dbname_users.sql3.导出一个数据库…

温故而知新 小测试

复习1.在下列的 HTML 中&#xff0c;哪个可以产生下拉列表&#xff1f;正确答案&#xff1a;<select>2.在下列的 HTML 中&#xff0c;哪个可以产生文本区&#xff08;textarea&#xff09;&#xff1f;正确答案&#xff1a;<textarea>3.请判断以下说法是否正确&…

Linux远程上传文件

#对拷文件夹 (包括文件夹本身) scp -r /home/slk root192.168.1.5:/home# 对拷文件并重命名 scp /home/a.txt root192.168.1.5:/home//b.text 转载于:https://www.cnblogs.com/Zhusi/p/11518160.html

php环境配置和nginx安装配置教程

首先先下载php php-5.6.30-Win32-VC11-x64 压缩包 下载完了直接解压(最好解压在C盘根目录&#xff0c;到时候更好找) 解压完了点进去找到 php.ini-development 配置文件 修改为php.ini 点进php.ini里面CtrlF 搜索 extension_dir "ext" 修改 "ext" 为 &…

kali 基础命令

查看当前文件夹内的文件&#xff1a;dir //不区分文件格式 ls //颜色区分文件夹与文件 进入a文件夹&#xff1a;cd a 新建文件夹&#xff1a;mkdir 删除文件夹&#xff1a;rmdir 删除文件&#xff1a;rm -rf 文件 编辑a文件&#xff1a;vi a //vi相当于记事本简洁操作 vim a //…

struts2 url 配置问题

2019独角兽企业重金招聘Python工程师标准>>> struts2 默认只处理/* 和*.action。 所以在web.xml中&#xff0c;如果不加以说明。<url-pattern>标签只能填写*.action或/* 。如果想使用*.do&#xff0c; 则需要 在struts.xml中添加 <constant name"stru…

ubnutu18.4 修改交换分区大小

ubuntu18.04默认的swap文件在根目录/下&#xff0c;名字是swapfile 1、查看交换分区大小 也可以使用系统监视器查看 free -m 2、创建一个swap文件 &#xff1a;大小为8g sudo dd if/dev/zero ofswap bs1024 count8000000 3、创建swap文件系统 sudo mkswap -f swap 4、开启swap…