深入java虚拟机从0到1
Posted 探索互联网
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入java虚拟机从0到1相关的知识,希望对你有一定的参考价值。
jvm java虚拟机是java编译出class运行的机器,我们编译出class文件均由他加载运行,是一台虚拟计算机。处理的是class字节码文件。
java虚拟机构成,运行时数据区包括方法区、堆、栈、pc寄存器、本地方法栈。
方法区,存储常量、类信息、方法信息等数据存储位置。运行时反射调用很多信息依赖于方法区数据存储。
堆,动态内存分配区,对象存储区域,是所有线程共享区域。是gc垃圾回收主要处理内存区域。
栈,存储方法调用信息区域。栈本身提供压栈出栈操作。栈数据每个线程独有,多个线程对栈数据访问不存在多线程同步问题。
pc寄存器,类似cpu寄存器是高速数据存储区。
本地方法栈,本地方法栈主要提供java调用非java语言主要比如c、c++,就需要通过本地方法栈实现对c、c++语言调用。
学习了解jvm有什么意义呢?通过学习java虚拟机能够理解整个语言机制,能帮我们更好运用java,再有就是在高并发、高性能场景下,学习理解java虚拟机成为一种必须。通过调整jvm 内存 gc配置来获得更高性能,承载更大流量服务。
一般最开始修改都是内存,最早我们搞web项目,业务中读取大的文件进行相应处理是常态,因为实际项目中读一些大的文件,会报java.lang.OutOfMemoryError,通过设置-Xms -Xmx调整堆大小来解决读取大文件内存溢出问题。
对于调整内存很多同学应该都进行过相应操作,更复杂一些是在高并发应用下怎样设置一种gc算法来适应高并发请求,并且能很快相应,尽少STW(Full GC导致业务线程挂起,世界停滞),需要不断深入对gc算法进行研究,并且有相应场景来进行尝试,不存在一种配置适合所有场景,这是基本认识,有了正确认识才好向下探索。配置需要根据具体情况进行调整,不存在银弹。
jvm重要配置是对gc算法配置,gc算法配置依赖于对程序是那种类型,吞吐量有限还是响应时间优先。gc算法设置本身也依赖于当前jvm所在机器配置,机器内存大小本身也关系着jvm配置。
jvm内存最大一般设置到机器内存 3/4,因为除了其他程序需要内存。jvm本身也会执行本地方法,本地方法使用堆外内存都要消耗机器内存。故jvm内存不能设置到过大。
jvm配置不是通用方式,而是要不断变化调整。在web以及移动应用后端服务场景下,均以快速响应,gc导致jvm少停断为目的。
jvm堆内存构成,jdk1.7 hotspot jvm内存主要eden区、survivor区、old区、perm区构成。高并发程序、响应优先程序应充分利用eden区和surivor区,减量少的让对象进入老年代,CMS垃圾收集算法是个不错选择。
虽然jvm存在不存在银弹,但还是有规律可循的,jvm配置一些基本规律:在高并发、高性能场景下,CMS GC算法是较好选择,一个比较重要前提是内存要大于4G也就是64机器,因为CMS算法本身会给年轻代分配较大空间,老年代分配比并行算法相对小,老年代过小会导致Full GC发生频发。
当下大部分线上高并发应用20万/min以上访问量,docker容器4核16G下面这种配置
-Xms8g -Xmx8g -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewRatio=2 -XX:SurvivorRatio=8 -XX:ParallelGCThreads=4 -XX:CMSInitiatingOccupancyFraction=80 -XX:+CMSParallelRemarkEnabled
GC导致线程数上升问题,内存过高问题,响应效果都有比较好的效果。
以上是关于深入java虚拟机从0到1的主要内容,如果未能解决你的问题,请参考以下文章
VMware虚拟机从安装到激活再到解决黑屏卡死机系列问题教程第一篇
PowerCLi 将虚拟机从Host01主机移动到Host02主机