小编juh*_*nic的帖子

节俭如何安全?re:我似乎有要求扰乱对方

编辑

显然我希望做的事情超出了节俭的范围......如果我确保端口上永远不会有多个客户端,那么一切都还可以.当然这种方式会失败,因为我希望为服务器提供几个可重用的连接,以缩短响应时间并降低开销.

如果有人建议采用另一种方式来实现这一目标,我们将不胜感激(或者如果我的结论是错误的)

背景

我有一个多组件应用程序,主要通过thrift连接(主要是java-> php连接).

到目前为止,它似乎都很好,但引入了Java-> Java连接,其中客户端是一个可以每秒发送数百个请求的servlet.

被访问的方法具有以下接口:

bool pvCheck(1:i32 toolId) throws(1:DPNoToolException nte),
Run Code Online (Sandbox Code Playgroud)

为了确保它在服务端不是奇怪的东西,我用一个简单的替换了实现:

    @Override
    public boolean pvCheck(int toolId) throws TException {
        //boolean ret = api.getViewsAndDec(toolId);
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

错误/可能的原因?

只要没有很多连接就可以了,但只要连接接近,连接就会开始卡在阅读器中.

如果我在调试器中拉出其中一个,则堆栈如下所示:

Daemon Thread [http-8080-197] (Suspended)   
    BufferedInputStream.read(byte[], int, int) line: 308    
    TSocket(TIOStreamTransport).read(byte[], int, int) line: 126    
    TSocket(TTransport).readAll(byte[], int, int) line: 84  
    TBinaryProtocol.readAll(byte[], int, int) line: 314 
    TBinaryProtocol.readI32() line: 262 
    TBinaryProtocol.readMessageBegin() line: 192    
    DumboPayment$Client.recv_pvCheck() line: 120    
    DumboPayment$Client.pvCheck(int) line: 105  
    Receiver.performTask(HttpServletRequest, HttpServletResponse) line: 157 
    Receiver.doGet(HttpServletRequest, HttpServletResponse) line: 109   
    Receiver(HttpServlet).service(HttpServletRequest, HttpServletResponse) line: …
Run Code Online (Sandbox Code Playgroud)

java thrift thread-safety

9
推荐指数
1
解决办法
8694
查看次数

更好的方法来识别没有收集垃圾的对象?

简而言之

我有一个程序,随着时间的推移逐渐使用越来越多的内存.我正在使用jmap和jhat来尝试和诊断它,但我仍然不是那里.

背景

该程序是一个长期运行的服务器,由hbase数据存储区支持,为许多其他东西提供thrift服务.但是,运行几天之后,它最终将达到分配的堆限制,并且几乎所有时间都在垃圾收集中来回晃动.似乎引用会被保存到某个地方的大量数据中

到目前为止我做了什么

在摆弄jstat和jconsole之后,我最终得到了运行进程的jmap的heapdumps,并通过jhat运行它,并且数字简单不会累加到内存利用率附近的任何地方

jmap -F -dump:live,format=b,file=heap.dump 12765

jmap -F -dump:format=b,file=heap.all 12765

直方图顶部的一些东西

Class   Instance Count  Total Size
class [B     7493    228042570
class java.util.HashMap$Entry    2833152     79328256
class [Ljava.util.HashMap$Entry;     541     33647856
class [Ljava.lang.Object;    303698  29106440
class java.lang.Long     2851889     22815112
class org.apache.hadoop.hbase.KeyValue   303593  13358092
class org.apache.hadoop.hbase.client.Result  303592  9714944
class [I     14074   9146580
class java.util.LinkedList$Entry     303841  7292184
class [Lorg.apache.hadoop.hbase.KeyValue;    303592  7286208
class org.apache.hadoop.hbase.io.ImmutableBytesWritable  305097  4881552
class java.util.ArrayList    302633  4842128
class [Lorg.apache.hadoop.hbase.client.Result;   297     2433488
class [C     5391    320190
Run Code Online (Sandbox Code Playgroud)

虽然这里的总数并没有加起来,但是在进行堆转储时,进程使用了​​超过1GB的内存.

直接明显的罪魁祸首似乎是我在整个地方留下了HBase Result和KeyValue条目.试图追踪引用,我最终命中了

Object …
Run Code Online (Sandbox Code Playgroud)

java debugging garbage-collection jvm jhat

8
推荐指数
1
解决办法
1392
查看次数

为什么使用 mmap 和 madvise 顺序逐行读取大文件比 fgets 慢?

概述

我有一个程序受 IO 限制,正在尝试加快速度。使用 mmap 似乎是一个好主意,但与仅使用一系列 fgets 调用相比,它实际上降低了性能。

一些演示代码

我已经将演示压缩到了基本要素,对一个 800mb 的文件进行了测试,大约有 350 万行:

使用 fgets:

char buf[4096];
FILE * fp = fopen(argv[1], "r");

while(fgets(buf, 4096, fp) != 0) {
    // do stuff
}
fclose(fp);
return 0;
Run Code Online (Sandbox Code Playgroud)

800mb 文件的运行时:

[juhani@xtest tests]$ time ./readfile /r/40/13479/14960 

real    0m25.614s
user    0m0.192s
sys 0m0.124s
Run Code Online (Sandbox Code Playgroud)

mmap 版本:

struct stat finfo;
int fh, len;
char * mem;
char * row, *end;
if(stat(argv[1], &finfo) == -1) return 0;
if((fh = open(argv[1], O_RDONLY)) == -1) return 0;

mem …
Run Code Online (Sandbox Code Playgroud)

c mmap systems-programming

6
推荐指数
1
解决办法
2950
查看次数

java中性能密集的字符串拆分和操作

通过非常简单的分隔符分割字符串的最有效方法是什么?

一些背景:

我正在移植一个我在C中用一堆指针算法编写的函数到java并且它非常慢(经过一些优化仍然慢了5*).对它进行了分析后,发现很多开销都在String.split中

有问题的函数采用主机名或IP地址并使其成为通用的:

123.123.123.123 - >*123.123.123

abcexample.com - >*example.com.

这可以定期运行数百万个项目,因此性能是一个问题.

编辑:转换的规则是:

  • 如果是IP地址,请替换第一部分
  • 否则,找到主域名,并使前面的部分通用.

foo.bar.com->*.bar.com foo.bar.co.uk->*.bar.co.uk

我现在已经使用lastIndexOf和substring重写了自己从后面工作,性能得到了突飞猛进的提升.

我会在24小时之前将问题保持开放,然后再确定最佳答案以供将来参考

这就是我现在提出的(在调用此函数之前,ip部分是一个无关紧要的检查)

private static String hostConvert(String in) {
    final String [] subs = { "ac", "co", "com", "or", "org", "ne", "net", "ad", "gov", "ed" };

    int dotPos = in.lastIndexOf('.');
    if(dotPos == -1)
        return in;
    int prevDotPos = in.lastIndexOf('.', dotPos-1);
    if(prevDotPos == -1)
        return in;
    CharSequence cs = in.subSequence(prevDotPos+1, dotPos);
    for(String cur : subs) {
        if(cur.contentEquals(cs)) {
            int start = in.lastIndexOf('.', prevDotPos-1);
            if(start == …
Run Code Online (Sandbox Code Playgroud)

java string performance

3
推荐指数
1
解决办法
2427
查看次数