golang动态加载原生代码思路(非plugin,非so文件。使用mmap形式运行机器码,可释放)

1.用go tool objdump,可以看到任意函数的机器码、汇编指令、偏移。(go源码下面有一个cmd/internal/goobj包,可以读到.o文件的重定向信息,更好。)

2.修改里面的golang内部函数的相对跳转,指向加载者相同的函数的地址(仍然可以用go tool objdump看到函数的初始地址),常见的有runtime.newobject、runtime.convT2Eslice、runtime.panicindex、runtime.morestack_noctxt等runtime系列函数。

3.修改golang类型指针偏移(当对象转换成interface{}时候,需要一个类型指针),指向加载者相同的类型。

4.修改指向字符串,全局变量,自定义函数的偏移(一般都是相对偏移)。

5.写入mmap,并执行。

整体思路是,通过修改偏移,复用加载者所用到的函数、golang内部函数、golang类型信息等。

缺点:

1.可以自定义类型,但是不能将这些类型的对象赋值到interface{}(加载者已定义的类型可以),比如使用fmt.Println打印这些对象(但是可以打印这些对象的成员)。因为golang内部的一些全局变量(比如golang类型)可能存在指针,而且开始就初始化了。

2.不能在函数外初始化全局变量。(可能的解决方法:定义一个入口函数,在里面初始化,或者读取main.init函数,取出初始化代码。)

优点:

仍然使用golang和golang编译工具。

速度极快,体积极小。相当于复用了golang内部的调度器、内存分配器、类型系统等。

可以自定义。golang函数内的汇编足够简单,可以开发自己的工具来实现上面的思路。

用途:

一些过滤,路由,缓存,前端逻辑。有很多逻辑直接在前端处理更好。

直接处理,不想放到后端,不想重启程序的服务,类似openresty。

「京东开涛」使用Nginx+Lua(OpenResty)开发高性能Web应用

京东三级列表页持续架构优化—Golang+Lua(OpenResty)最佳实践
 

golang动态加载原生代码思路的更多相关文章

  1. goloader - golang动态加载的实现

    github地址:https://github.com/dearplain/goloader 这里有以前的一些思路:http://www.cnblogs.com/dearplain/p/8145985 ...

  2. (转)高性能JavaScript:加载和运行(动态加载JS代码)

    浏览器是如何加载JS的 当浏览器遇到一个<script>标签时,浏览器首先根据标签src属性下载JavaScript代码,然后运行JavaScript代码,继而继续解析和翻译页面.如果需要 ...

  3. 动态加载JS代码

    到处查资料研究js动态脚本的加载,找到以下7种方法,总有一种适合你! 首先我们需要一个被加载的js文件,我在一个固定文件夹下创建了一个package.js,打开后在里面写一个方法functionOne ...

  4. JavaScript 之 动态加载JS代码或JS文件

    2.动态加载JS文件 <script type="text/javascript"> function loadScript(url, callback) { var ...

  5. ASP.NET动态加载Js代码到Head标签中(三种方法)

    方法一代码如下: HtmlGenericControl Include2 = new HtmlGenericControl("script"); Include2.Attribut ...

  6. [改善Java代码]动态加载不适合数组

    上一个建议解释了为什么要使用forName,本建议就说说哪些地方不适合使用动态加载. 如果forName要加载一个类,那它必须是一个类------8中基本类型就排除在外.它们不是一个具体的类. 其次它 ...

  7. [JS前端开发] js/jquery控制页面动态加载数据 滑动滚动条自动加载事件

    页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空 ...

  8. shiro不重启动态加载权限

    最近一朋友让我帮他做一个后台权限管理的项目.我就在我原来的项目加加改改但是还是不理想,查了不少资料也走了不了弯路...... shiro基本的配置我就不多说了这个很简单自己查查资料就完成----下面是 ...

  9. js/jquery控制页面动态加载数据 滑动滚动条自动加载事件--转他人的

    js/jquery控制页面动态加载数据 滑动滚动条自动加载事件--转他人的 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样 ...

随机推荐

  1. poj 1797 Heavy Transportation(最大生成树)

    poj 1797 Heavy Transportation Description Background Hugo Heavy is happy. After the breakdown of the ...

  2. 003Java语言环境搭建

    JRE,JDK JRE(Java Runtime Environment java运行环境):包括java虚拟机和java程序所需要的核心类库, 如果要运行一个开发好的java程序,计算机中只需要安装 ...

  3. CentOS6.5安装MySQL5.6

    CentOS6.5安装MySQL5.6,开放防火墙3306端口,允许其他主机使用root账户密码访问MySQL数据库 查看操作系统相关信息 ** 该查看方法只适用于CentOS6.5 (lsb_rel ...

  4. android 使用Ksoap2工具类实现WebService网络编程

    1.下载Ksoap2,将jar包拷贝到libs目录下.然后右键点击拷贝进来的jar,在弹出菜单中点击Add As Library. 2.在AndroidManifest.xml中添加访问网络的权限 & ...

  5. ES6原生Promise的所有方法介绍(附一道应用场景题目)

    JS的ES6已经出来很久了,作为前端工程师如果对此还不熟悉有点说不过去.不过如果要问,Promise原生的api一共有哪几个?好像真的可以难倒一票人,包括我自己也忽略了其中一个不常用的API Prom ...

  6. IOC容器在web容器中初始化过程——(二)深入理解Listener方式装载IOC容器方式

    先来看一下ContextServletListener的代码 public class ContextLoaderListener extends ContextLoader implements S ...

  7. SoapUI模拟soap接口返回不同响应(通过groovy脚本)

    一.创建soap项目,输入wsdl文件,然后生成SOAP Mock Service,再生成测试用例,然后新建新的响应 WSDL文件:MathUtil.wsdl <?xml version=&qu ...

  8. Node.js前言

    最近在学Node.js,所以学到一点东西就更新在上面吧,如果有错误,欢迎大家指正.

  9. Qt---Javascript/Qt交互、脚本化

    Qt提供了对Javascript的良好支持, 如果查阅过文档你就知道Qt有两个不同的Js封装引擎: QScriptEngine QJSEngine QScriptEngine出现的比较早(自Qt4.3 ...

  10. adb指令介绍

    一.adb命令格式为:adb [-d|-e|-s <serialNumber>] <command> 1.adb devices :列出当前电脑所连接的所有安卓设备 2.adb ...