java 进程是如何在Linux服务器上进行内存分配的

众所周知,Java进程在启动的时候我们可以通过 -Xms 和-Xmx来设置内存的上限和下限。直到我发现使用top命令监控的Java进程在-Xms设置4g的情况下占用的内存并不是4g,这就产生了一个疑问Linux服务器的内存到底是如何进行分配的。

于是乎,我查阅了一些知乎,课程以及Linux相关的书籍。这里分享并记录的一下相关的知识。

在Linux上运行的进程不仅限于Java。都有一个概念,逻辑内存(Logic Memory),而物理机真是持有的内存,我们称为 物理内存(Physic Memory)。

进程在开始运行时并不会直接分配物理内存,进程只是傻乎乎的以为自己持有了内存,也就是逻辑内存。当程序运行需要内存分配的时候,Linux服务器会以页的(Page)至小4k的方式分配,并一对一映射物理内存和逻辑内存的关系,看到了吗这里其实用了代理的思想是得内存的分配进行了解耦。

这样做的好处是什么呢? 1进程之间相互隔离 2进程自己认为占有了一段独立连续的内存 3可以申请比物理内存更大的内存空间。

第三点怎么理解呢?其实Linux在这里设计了一种机制叫Swap 就是在进程分配的内存空间超过物理内存的时候,如果各个进程运行所占的内存真的有这么多,超过了物理内存就会触发Swap,把不持有CPU的部分进程的内存数据和磁盘进行io数据交换。因为CPU一时间不可能超过所有占有的内存,所以这种优化就造就了能多申请一些内存,大概是原来内存的2-3倍,这就很可观了,毕竟内存是非常贵的。

Swap虽然好,也带来了一些问题。

比如频繁的Swap,这会导致内存操作转化为磁盘的的IO操作,拖慢应用进程的运行速度。所以说Swap在我的理解里属于可以应急不使进程崩溃,适当使用可以减少成本,过分了不当人的使用就会被反噬的机制。

当然如果太不当人,进程还是会崩溃了,Swap是一个类似Buffer的机制,有大小的。超过设置的上限,Kernel内核就会触发OOM Killer,杀死一部分进程腾空间。

以上就是java 进程是如何在Linux服务器上进行内存分配的的详细内容,更多关于java 进程内存分配的资料请关注我们其它相关文章!

(0)

相关推荐

  • idea插件篇之java内存分析工具(JProfiler)的使用

    前言 在运行java的时候有时候想测试云运行时占用内存情况,这时候就需要使用测试工具查看了.在eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试,而在idea中也有这么一个插件,就是JProfilerl. 下载安装 打开idea,进入设置界面 安装之后重启即可. 安装成功后查看情况. 这是什么情况呢,这是这个插件启动需要依赖一个可执行的文件,就是源生的JAVA PROFILER 去官网下载 https://www.ej-technologies.

  • Java GZip 基于内存实现压缩和解压的方法

    欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!   GZip是常用的无损压缩算法实现,在Linux中较为常见,像我们在Linux安装软件时,基本都是.tar.gz格式..tar.gz格式文件需要先对目录内文件进行tar压缩,然后使用GZip进行压缩.   本文针对基于磁盘的压缩和解压进行演示,演示只针对一层目录结构进行,多层目录只需递归操作进行即可.   Maven依赖   org.apache.commons: commons-compress: 1.19: 此依赖封装了很多压缩算

  • 排查Java应用内存泄漏问题的步骤

    什么是内存泄漏 内存泄漏是指java应用的堆内存使用率持续升高,直至内存溢出. 内存泄漏的的原因可能有多种 分配给应用程序的内存本身过小.而应用的业务代码,确实需要生成大量的对象 代码bug,某些需要被回收的对象,由于代码bug,却持续的被引用,导致java虚拟机无法回收这些对象.从而撑爆内存 无论哪种内存泄露,我们的解决方法都是要定位到具体是什么对象,占用了大量内存,从而方便我们基于此进行代码分析,debug,找出代码问题. 而能够帮助我们实现这一目的的方式就是获取java应用的内存 dump

  • java 将数据加载到内存中的操作

    将数据加载到内存中 1.建立InitListener.java package app.util; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.ServletException; import javax.servlet.http.

  • Java内存释放实现代码案例

    先贴代码: StringBuilder dada = null; for(int i=0; i<1000; i++){ dada = new StringBuilder(); for(int j=0; j<1000; j++){ dada.append("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); } } System.out.println("释放前"); StringBuilder dad

  • Java内存模型知识详解

    1. 概述 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标比较能说明问题,它代表着一秒内服务器平均能响应的请求数,而TPS值与程序的并发能力有着非常密切的关系.在讨论Java内存模型和线程之前,先简单介绍一下硬件的效率与一致性. 2.硬件的效率与一致性 由于计算机的存储设备与处理器的运算能力之间有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理

  • JAVA内存模型和Happens-Before规则知识点讲解

    我们在本篇内容里聊一聊JAVA的内存模型和Happens-Before规则. JAVA内存模型 这里的JAVA内存模型指的不是我们JVM专栏中提到的内存分布模型,而是针对并发编程的,小伙伴们不要混淆概念了. 我们已经知道,导致可见性问题的是缓存,导致有序性问题的是指令重排,那么禁用缓存和禁用指令重排不就可以避免出现这两种问题了吗. 但想想也知道,如果直接禁用掉,性能会大打折扣,所以正确的方式应该是按需禁用. 只有程序员才能分析出什么时候应该禁用,所以为了解决可见性和有序性,其实只要提供给程序员按

  • Java虚拟机使用jvisualvm工具远程监控tomcat内存

    jdk中自带了很多工具可以用于性能分析,位于jdk的bin目录下,jvisualvm工具可以以图形化的方式更加直观的监控本地以及远程的java进程的内存占用,线程状态等信息. 一.配置tomcat 在tomcat的catalina.sh文件开头加上如下配置: JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.ssl=fa

  • java 进程是如何在Linux服务器上进行内存分配的

    众所周知,Java进程在启动的时候我们可以通过 -Xms 和-Xmx来设置内存的上限和下限.直到我发现使用top命令监控的Java进程在-Xms设置4g的情况下占用的内存并不是4g,这就产生了一个疑问Linux服务器的内存到底是如何进行分配的. 于是乎,我查阅了一些知乎,课程以及Linux相关的书籍.这里分享并记录的一下相关的知识. 在Linux上运行的进程不仅限于Java.都有一个概念,逻辑内存(Logic Memory),而物理机真是持有的内存,我们称为 物理内存(Physic Memory

  • 在linux服务器上安装Jenkins

    Jenkins是用java编写的开源持续集成工具,目前被国内外各公司广泛使用.本章教大家如何在linux服务器上安装Jenkins. 一.获得一台linux服务器 要在linux下安装git,首先你得先有一台linux服务器,作为小白,手头的机器肯定都是windows的,搞个虚拟机安装对我这种小白简直是折磨人:这里使用最简单的方式获得一台linux服务器,就是从阿里云上租一台.镜像选择CentOS7.3 64位. 二.安装jdk Jenkins的运行需要依赖jdk,所以在安装Jenkins之前我

  • java获取linux服务器上的IP操作

    在编码过程中需要获取本地IP地址,首先使用的是下面的方法,在Windows环境正常,但是linux服务器上就获取不到, public static String getIpAddress() { String hostAddress = ""; try { InetAddress address = InetAddress.getLocalHost(); hostAddress = address.getHostAddress(); } catch (UnknownHostExcept

  • Tomcat在Linux服务器上的BIO、NIO、APR模式设置方法

    一.BIO.NIO.AIO 先了解四个概念: 同步 : 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步 : 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS(银行卡和密码),OS需要支持异步IO操作API). 阻塞 : ATM排队取款,你只能等待(使用阻塞IO时,Java调用会一直阻塞到读写完成才返回). 非阻塞 : 柜台取款,取个号,然后坐在椅子上做其它事,等号广播会通知你办理,没到

  • 查看linux服务器上jdk的安装路径方法

    查看linux服务器上jdk的安装路径方法 如何在一台Linux服务器上查找JDK的安装路径呢? 有那些方法可以查找定位JDK的安装路径?是否有一些局限性呢? 下面总结了一下如何查找JDK安装路径的方法. 1:echo $JAVA_HOME 使用$JAVA_HOME的话能定位JDK的安装路径的前提是配置了环境变量$JAVA_HOME,否则如下所示,根本定位不到JDK的安装路径 [root@localhost ~]# java -version java version "1.7.0_65&quo

  • Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上

    Windwos下使用winscp和批处理实现通过SSH端口上传文件到Linux服务器上 今天同事想在windows上使用winscp上传文件到linux服务器上,又想偷懒想使用批处理来进行上传,还好只固定上传一个php文件,多了还真不好搞. 1.下载winscp 大家可以去网上自己找,我把winscp安装在c:下的 2.把要执行的命令保存到文件winscp.bat里,这个winscp.bat可以自己创建,我是放在d:下的. winscp.bat脚本内容: 复制代码 代码如下: option co

  • 查看linux服务器上mysql配置文件路径的方法

    在类NUIX的系统中,配置文件的位置一般在/etc/my.cnf 或者 /etc/MySQL/my.cnf 我们见过有些人尝试修改配置文件但是不生效,因为他们修改的并不是服务器读取的文件.例如Debian下,/etc/mysql/my.cnf才是MySQL读取的配置文件,而不是/etc/my.cnf. 如果不知道当前使用的配置文件路径,可以尝试下面的操作: 对于服务器上只有一个MySQL实例的典型安装,这个命令很有用 以上就是小编为大家带来的查看linux服务器上mysql配置文件路径的方法全部

  • 在Linux服务器上安装 memcached的基本操作

    一.memcached的安装 1.下载 memcached-1.4.33.tar.gz.libevent-2.0.22-stable.tar.gz 安装 memcached 依赖 libevent 2.安装 libevent a.解压 [root@iZ28b4kreuaZ webserver]# tar zxvf libevent-2.0.22-stable.tar.gz b.安装在 /usr/local/下 进入解压目录下:[root@iZ28b4kreuaZ libevent-2.0.22-

  • python 读取Linux服务器上的文件方法

    使用Python语句,读取Linux远端服务器上的文件打印到控制台的代码实现: 下载包:paramiko import paramiko #服务器信息,主机名(IP地址).端口号.用户名及密码 hostname = "" port = 22 username = "" password = "" client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.Au

  • 如何使用Shell脚本掩盖Linux服务器上的操作痕迹(推荐)

    使用Shell脚本在Linux服务器上能够控制.毁坏或者获取任何东西,通过一些巧妙的攻击方法黑客可能会获取巨大的价值,但大多数攻击也留下踪迹.当然,这些踪迹也可通过Shell脚本等方法来隐藏. 寻找攻击证据就从攻击者留下的这些痕迹开始,如文件的修改日期.每一个 Linux 文件系统中的每个文件都保存着修改日期.系统管理员发现文件的最近修改时间,便提示他们系统受到攻击,采取行动锁定系统.然而幸运的是,修改时间不是绝对可靠的记录,修改时间本身可以被欺骗或修改,通过编写 Shell 脚本,攻击者可将备

随机推荐