JVM的小问题-创新互联-成都快上网建站

JVM的小问题-创新互联

什么是JVM

JVM是java程序运行的底层平台,与Java支持库一起构成了Java程序的执行环境

创新互联建站专注于长兴企业网站建设,响应式网站设计,成都做商城网站。长兴网站建设公司,为长兴等地区提供建站服务。全流程专业公司,专业设计,全程项目跟踪,创新互联建站专业和态度为您提供的服务

JVM虚拟机就是指能执行标准Java字节码的虚拟计算机

JDK与JVM的区别

JDK中包含JRE,JRE中包含JVM

JDK=JRE+开发调试诊断工具,JRE=JVM+Java标准库

JVM厂商

Oracle,IBM,阿里巴巴,亚马逊,Red Hat,Adopt OpenJDK

OracleJDK与OpenJDK有什么区别?

各种版本的JDK一般来说都会符合Java虚拟机规范。

两者的区别一般来说包括:

两种JDK提供的工具套件略有差别,比如jmc等有版权的工具。

某些协议或配置不一样,比如美国限制出口的加密算法。

其他细微差别,比如JRE中某些私有的API不一样。

Java最受欢迎的长期维护版本是Java8和Java11

Java8是经典LTS版本,性能优秀,系统稳定,良好支持各种CPU架构和操作系

统平台。

Java11是新的长期支持版,性能更强,支持更多新特性,而且经过几年的维护已经很稳定。

一般来说。 测试环境、预上线环境的JDK配置需要和生产环境一致。

Java字节码

Java源代码编译后的中间代码格式

字节码文件中包含哪些内容

版本号信息静态常量池(符号常量)

类相关的信息

字段相关的信息

方法相关的信息

调试相关的信息

什么是常量

常量是指不变的量,字母 ‘K’ 或者数字 1024 在UTF8编码中对应到对应的二进制格式都是不变的。同样地,字符串在Java中的二进制表示也是不变的, 比如 “KK” 。在Java中需要注意的是, final 关键字修饰的字段和变量,表示最终变量,只能赋值1次,不允许再次修改,由编译器和执行引擎共同保证

怎么理解常量池

在Java中,常量池包括两层含义:

静态常量池,class文件中的一个部分,里面保存的是类相关的各种符号常量。

运行时常量池, 其内容主要由静态常量池解析得到,但也可以由程序添加。

JVM运行时数据区有哪些

程序计数器 ,Java虚拟机栈,堆内存,方法区,运行时常量池,本地方法栈

什么是堆内存

堆内存是指由程序代码自由分配的内存,与栈内存做区分

在Java中,堆内存主要用于分配对象的存储空间,只要拿到对象引用,所有的线程都可以访问堆内存

堆内存包括哪些部分

新生代,老年代,存活区,新生代和存活区一般称为年轻代

什么是非堆内存

除堆内存外,JVM的内存池还存储非堆(NON_HEAP),对应于JVM规范中的方法区

什么是内存溢出

内存溢出是指可用内存不足

程序运行需要使用的内存超过大可用值,如果不进行处理就会影响其他进程,所以现在的操作系统的处理办法是:只要超出立即报错

就像杯子里的水,满了就要溢出来

什么是内存泄露

内存泄漏是指本来无用的对象却继续占用内存,没有在恰当的时机释放占用的内存

不使用的内存,却没有释放,称为内存泄漏,也就是该释放的没释放,该回收的没回收

例子:每一个请求进来,或者每进行一次操作处理,都分配了内存,却有一部分不能回收(或未释放),那么随着处理的请求越来越多,内存泄漏也就越来越严重

在Java中一般是指无用的对象却因为错误的引用关系,不能被GC回收

内存泄漏与内存溢出的关系

如果存在严重的内存泄漏问题,随着时间的推移,必然会造成内存溢出

内存泄漏一般是资源管理问题和程序BUG,内存溢出则是内存空间不足和内存泄漏的最终结果

给定一个具体的类,计算对象的内存占用

对象头占用12字节。

每个long类型的字段占用8字节,3个long字段占用24字节。

byte 字段占用1个字节。

以上合计 37字节,加上以8字节对齐,则实际占用45个字节。

对象头中包含哪些部分

标记字,占用一个机器字(1位),也就是8字节

类型指针,占用一个机器字

在堆内存小于32GB,JVM会默认开启指针压缩,则只占用4个字节

如果是数组,对象头中还会多出一部分,数组长度,int值,占用4个字节

常用的JVM启动参数有哪些
# JVM启动参数不换行
# 设置堆内存
‐Xmx4g ‐Xms4g
# 指定GC算法
‐XX:+UseG1GC ‐XX:MaxGCPauseMillis=50
# 指定GC并行线程数
‐XX:ParallelGCThreads=4
# 打印GC日志
‐XX:+PrintGCDetails ‐XX:+PrintGCDateStamps
# 指定GC日志文件
‐Xloggc:gc.log
# 指定Meta区的大值
‐XX:MaxMetaspaceSize=2g
# 设置单个线程栈的大小
‐Xss1m
# 指定堆内存溢出时自动进行Dump
‐XX:+HeapDumpOnOutOfMemoryError
‐XX:HeapDumpPath=/usr/local/

还有一些常用的属性配置:

# 指定默认的连接超时时间
‐Dsun.net.client.defaultConnectTimeout=2000
‐Dsun.net.client.defaultReadTimeout=2000
# 指定时区
‐Duser.timezone=GMT+08
# 设置默认的文件编码为UTF‐8
‐Dfile.encoding=UTF‐8
# 指定随机数熵源(Entropy Source)
‐Djava.security.egd=file:/dev/./urandom
设置堆内存Xmx应该考虑哪些因素?

需要根据系统得配置来确定,要给操作系统和JVM本身留下一定得剩余空间,推荐配置系统或容器里可用内存得70~80%最好

假设物理内存是8G,设置多大堆内存比较合适

比如说系统有8G物理内存,系统自己可能会用掉一点,大概还有7.5G可用,那么建议配置-Xml6g

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:JVM的小问题-创新互联
分享链接:http://kswjz.com/article/dheepp.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流