`
lobin
  • 浏览: 430929 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JVM EPollArrayWrapper

 
阅读更多

EPollArrayWrapper

 

EPollArrayWrapper类在jdk\src\solaris\classes\sun\nio\ch目录下。用于linux平台下,操作一个本地epoll_event结构数组。主要封装了epoll的相关函数调用。

 

EPollArrayWrapper

普通方法

initInterrupt

putEventOps

putData

putDescriptor

getEventOps

getDescriptor

setInterest

add

release

closeEPollFD

poll

updateRegistrations

interrupt

interruptedIndex

interrupted

clearInterrupted

EPollArrayWrapper

EPollArrayWrapper通过Native方法与JVM交互。Native实现在jdk\src\solaris\native\sun\nio\ch目录下,对应EPollArrayWrapper.c。

 

 

EPollArrayWrapper

Native方法

epollCreate

epollCtl

epollWait

sizeofEPollEvent

offsetofData

fdLimit

interrupt

init

EPollArrayWrapper

初始化init

执行一些初始化操作:

通过dlsym方式将

epoll_create_func指向epoll_create

epoll_ctl_func指向epoll_ctl

epoll_wait_func指向epoll_wait

 

 

 

 

EPollArrayWrapper

源代码如下:

JNIEXPORT void JNICALL

Java_sun_nio_ch_EPollArrayWrapper_init(JNIEnv *env, jclass this)

{

    epoll_create_func = (epoll_create_t) dlsym(RTLD_DEFAULT, "epoll_create");

    epoll_ctl_func    = (epoll_ctl_t)    dlsym(RTLD_DEFAULT, "epoll_ctl");

    epoll_wait_func   = (epoll_wait_t)   dlsym(RTLD_DEFAULT, "epoll_wait");

 

    if ((epoll_create_func == NULL) || (epoll_ctl_func == NULL) ||

        (epoll_wait_func == NULL)) {

        JNU_ThrowInternalError(env, "unable to get address of epoll functions, pre-2.6 kernel?");

    }

}

 

 

 

 

EPollArrayWrapper

创建epoll epollCreate

 

源代码如下:

JNIEXPORT jint JNICALL

Java_sun_nio_ch_EPollArrayWrapper_epollCreate(JNIEnv *env, jobject this)

{

    /*

     * epoll_create expects a size as a hint to the kernel about how to

     * dimension internal structures. We can't predict the size in advance.

     */

    int epfd = (*epoll_create_func)(256);

    if (epfd < 0) {

       JNU_ThrowIOExceptionWithLastError(env, "epoll_create failed");

    }

    return epfd;

}

 

 

 

EPollArrayWrapper

获取文件句柄上限 fdLimit

用于获取打开的文件句柄上限,这里是socket句柄。这个限制实际上可以通过ulimit 进行查看和设置。可以通过ulimit –a查看open files                      (-n),也可以通过ulimit –n直接查看。

 

 

 

 

 

EPollArrayWrapper

源代码如下:

JNIEXPORT jint JNICALL

Java_sun_nio_ch_EPollArrayWrapper_fdLimit(JNIEnv *env, jclass this)

{

    struct rlimit rlp;

    if (getrlimit(RLIMIT_NOFILE, &rlp) < 0) {

        JNU_ThrowIOExceptionWithLastError(env, "getrlimit failed");

    }

    return (jint)rlp.rlim_max;

}

 

 

 

 

 

 

EPollArrayWrapper

epoll_event结构大小

源代码如下:

JNIEXPORT jint JNICALL

Java_sun_nio_ch_EPollArrayWrapper_sizeofEPollEvent(JNIEnv* env, jclass this)

{

    return sizeof(struct epoll_event);

}

 

 

 

 

 

EPollArrayWrapper

用户数据data字段在epoll_event结构中的偏移量 offsetofData

JNIEXPORT jint JNICALL

Java_sun_nio_ch_EPollArrayWrapper_offsetofData(JNIEnv* env, jclass this)

{

    return offsetof(struct epoll_event, data);

}

 

 

 

 

EPollArrayWrapper

在epfd 上执行操作 epollCtl

源代码如下:

JNIEXPORT void JNICALL

Java_sun_nio_ch_EPollArrayWrapper_epollCtl(JNIEnv *env, jobject this, jint epfd,

                                           jint opcode, jint fd, jint events)

{

    struct epoll_event event;

    int res;

 

    event.events = events;

    event.data.fd = fd;

 

    RESTARTABLE((*epoll_ctl_func)(epfd, (int)opcode, (int)fd, &event), res);

 

    /*

     * A channel may be registered with several Selectors. When each Selector

     * is polled a EPOLL_CTL_DEL op will be inserted into its pending update

     * list to remove the file descriptor from epoll. The "last" Selector will

     * close the file descriptor which automatically unregisters it from each

     * epoll descriptor. To avoid costly synchronization between Selectors we

     * allow pending updates to be processed, ignoring errors. The errors are

     * harmless as the last update for the file descriptor is guaranteed to

     * be EPOLL_CTL_DEL.

     */

    if (res < 0 && errno != EBADF && errno != ENOENT && errno != EPERM) {

        JNU_ThrowIOExceptionWithLastError(env, "epoll_ctl failed");

    }

}

 

 

 

EPollArrayWrapper

epoll_wait

源代码如下:

JNIEXPORT jint JNICALL

Java_sun_nio_ch_EPollArrayWrapper_epollWait(JNIEnv *env, jobject this,

                                            jlong address, jint numfds,

                                            jlong timeout, jint epfd)

{

    struct epoll_event *events = jlong_to_ptr(address);

    int res;

 

    if (timeout <= 0) {           /* Indefinite or no wait */

        RESTARTABLE((*epoll_wait_func)(epfd, events, numfds, timeout), res);

    } else {                      /* Bounded wait; bounded restarts */

        res = iepoll(epfd, events, numfds, timeout);

    }

 

    if (res < 0) {

        JNU_ThrowIOExceptionWithLastError(env, "epoll_wait failed");

    }

    return res;

}

 

 

 

 

EPollArrayWrapper

中断操作 interrupt

源代码如下:

JNIEXPORT void JNICALL

Java_sun_nio_ch_EPollArrayWrapper_interrupt(JNIEnv *env, jobject this, jint fd)

{

    int fakebuf[1];

    fakebuf[0] = 1;

    if (write(fd, fakebuf, 1) < 0) {

        JNU_ThrowIOExceptionWithLastError(env,"write to interrupt fd failed");

    }

}

 

 

0
0
分享到:
评论

相关推荐

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...

    jdk,jvm源码

    Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...

    jvm 详细介绍,了解jvm各个组成部分和功能

    ### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心在于源文件的编译与执行。不同于 C/C++ 这类需要针对不同平台进行编译的语言,Java 采用了一种更为灵活的...

    SAP JVM 8.1 64 bits

    SAP JVM 8.1 64位是一个专为SAP系统设计的Java虚拟机,它基于Oracle的Java Development Kit (JDK) 进行优化,以满足SAP应用程序的特定需求。SAP JVM旨在提高性能、可靠性和安全性,同时确保与SAP产品的无缝集成。...

    JVM图解-JVM指令-JVM原型图.rar

    在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...

    JVM中文指令手册.pdf

    JVM(Java Virtual Machine,Java虚拟机)是运行所有Java程序的假想计算机,是Java程序的运行环境,负责执行指令、管理数据、内存、寄存器等,是实现Java跨平台特性的关键部分。JVM指令手册详细记录了JVM的所有操作...

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    在Java开发领域,JVM(Java Virtual Machine)是运行所有Java程序的核心,它负责解析字节码并执行程序。深入理解JVM的内核原理、诊断技巧以及优化方法对于提升应用性能至关重要。本教程——“深入JVM内核—原理、...

    jvm 启动过程 JVM 原理

    Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...

    狂神说JVM探究.rar

    【狂神说JVM探究】是一份集合了多种格式的学习资料,主要涵盖了Java虚拟机(JVM)的基础知识。这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键...

    JVM必知必会

    ### JVM必知必会知识点梳理 #### 1. JVM的定义与层次 Java虚拟机(JVM)具有多重含义: - **一套规范**:即Java虚拟机规范,定义了Java虚拟机应该具有的行为。 - **一种实现**:例如HotSpot、J9、JRockit,它们都是...

    JVM 输出 GC 日志导致 JVM 卡住

    JVM 输出 GC 日志导致 JVM 卡住 JVM 输出 GC 日志导致 JVM 卡住是一个常见的问题,尤其是在高并发和高性能应用中。这个问题的根源在于 JVM 的垃圾回收机制(Garbage Collection,GC),它会在 JVM 运行时周期性地...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    本系列课程从JVM基础到高级实战,老师手把手教你如何进行JVM调优,思路清晰,没有废话,旨在挑战高薪。 课程亮点: 1、基于阿里arthas进行JVM调优; 2、基于代码排查OOM问题,拒绝空讲; 3、总结JVM通用的调优思路;...

    jvm-mon基于控制台的JVM监视

    【jvm-mon基于控制台的JVM监视】 `jvm-mon`是一款实用的工具,它允许开发者通过控制台界面实时监控Java虚拟机(JVM)的状态。在Java开发过程中,性能分析是至关重要的,因为良好的性能能提升用户体验,降低服务器...

    JVM面试资料:JVM结构、JVM调优、四大垃圾回收算法、七大垃圾回收器

    JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel...

    (46页完整版)JVM体系结构与GC调优.zip

    46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT...

    jvm视频及笔记

    Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释和执行字节码,为开发者提供了跨平台的运行环境。"jvm视频及笔记"这个资源显然是一份全面学习JVM的材料,结合了视频教程和书面笔记,帮助学习者深入理解JVM的...

    JVM原理讲解和调优,详细讲解JVM底层

    JVM(Java虚拟机)是Java语言运行的基础,它负责执行Java字节码,并且是Java跨平台特性的关键实现。JVM的主要职责包括加载Java程序、验证字节码、将字节码转换成机器码执行、内存管理、垃圾回收和提供安全机制等。...

    idea插件JVM内存工具JProfiler11

    5. **JVM配置调整**:JProfiler11还可以提供JVM参数建议,帮助开发者正确设置JVM初始堆大小、最大堆大小、内存池等关键参数,确保应用程序稳定运行。 在实际使用中,JProfiler11的详细报告和可视化界面使得问题定位...

    深入JVM内核—原理、诊断与优化

    《深入JVM内核—原理、诊断与优化》是一份深度探索Java虚拟机(JVM)的视频教程,旨在帮助开发者全面理解JVM的工作机制,掌握性能诊断技巧,并能进行有效的优化。本教程覆盖了从基础到高级的JVM主题,不仅适用于Java...

    JVM系列之性能调优参考手册(实践篇).pdf

    标题《JVM系列之性能调优参考手册(实践篇)》涉及的知识点主要集中在Java虚拟机(JVM)性能调优的实践操作。JVM作为Java程序运行的基础环境,对程序性能有着决定性影响。本手册的目的是指导开发者如何对JVM进行性能...

Global site tag (gtag.js) - Google Analytics