- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
public static Cursor getListGroupCursor(Activity activity,
ShopListItem list, boolean marked) {
long state = marked ? Cells.PURCHAZED_STATE : Cells.WANT_TO_BUY_STATE;
String where;
String[] arg;
if (list.isAutoList()) {
where = Cells.STATE + " = ?";
arg = new String[] { Long.toString(state) };
} else {
where = Cells.LIST_ID + " = ? AND " + Cells.STATE + " = ?";
arg = new String[] { Long.toString(list.getId()),
Long.toString(state) };
}
Cursor c = activity.managedQuery(Cells.CONTENT_URI,
new String[] { Cells.CATEGORY_ID }, where, arg,
Cells.DISTINCT_SORT_ORDER);
ArrayList<Long> ids = new ArrayList<Long>();
while (c != null && c.moveToNext()) {
ids.add(new Long(c.getLong(c.getColumnIndex(Cells.CATEGORY_ID))));
}
if (c != null) {
c.close();
}
int count = ids.size();
String whereGroup = null;
String[] argGroup = null;
if (count > 0) {
whereGroup = "";
argGroup = new String[count];
for (int i = 0; i < count; i++) {
if (i < count - 1) {
whereGroup += (Categories._ID + "= ? OR ");
} else {
whereGroup += (Categories._ID + "= ?");
}
argGroup[i] = Long.toString(ids.get(i));
// Log.i(tag, "getListGroupCursor "+argGroup[i]);
}
} else {
whereGroup = Categories._ID + "= -1";
}
Cursor groupCursor = activity.managedQuery(Categories.CONTENT_URI,
null, whereGroup, argGroup, Categories.DEFAULT_SORT_ORDER);
return groupCursor;
}
Работа с ContentProvider в android. Выборка категорий, id которых присутствуют в результатах первой выборки (по признаку)
Dummy00001 19.01.2011 18:39 # 0
меня тут уже давеча спрашивали типа как это может быть что на айфоне с его доисторическим процом все работает быстрее чем на андроиде с гигагерцовым процом...
xXx_totalwar 19.01.2011 18:47 # 0
Dummy00001 19.01.2011 19:05 # 0
выглядит что на самом деле андроид есть http://en.wikipedia.org/wiki/JavaOS
и меня до сих пор бесит что эти чудаки в Жабе так и не сделали `delete`. блин даже в пыхе есть unset. я понимаю что у меня это легкая параноя, но блин сколько памяти вот тот код кидает в GC - хотя там почти каждая временная переменная может быть немедленно удалена.
ну да ничего. процы нынче дешевые. скоро сделают дуал коре ARM проц, проблема говно-языков сама собой рассосётся.
Мистер Хэнки 19.01.2011 20:44 # 0
не совсем понял... если нужно удалить объект obj, то напишите obj = null; и тогда (при условию что больше ссылок на него нет) сборщик мусора поставит это объект в "расстрельный список" и уничтожит при первой возможности. Или в чем проблема?
Dummy00001 19.01.2011 20:49 # 0
Анонимус 19.01.2011 21:44 # −2
а в стеке соседнего потока осталась на него ссылка (извините, указатель). Что будет с указателем?
Dummy00001 19.01.2011 23:04 # 0
типа как это и работает в других языках: в перле undef, в пыхе unset, в oбжси release/autorelease.
Анонимус 19.01.2011 23:10 # −2
так это не delete ни разу)
Для этого есть метод в Runtime, кстати.
но слава богу что никто им не пользуется, иначе код был бы полон бойлерплейта
и вот еще что: ГЦ бы работал постоянно
и программа вечно бы стояла раком
Dummy00001 19.01.2011 23:42 # 0
> Для этого есть метод в Runtime, кстати.
ссылочку? у нас тут есть жабный сервачок с проблемкой. может поможет немного коллегам жабщикам. (хотя сомневаюсь, там все 3rd пати либами обложено.)
Анонимус 20.01.2011 00:03 # 0
может выкинуть нахер всё остальное?)
ссылочку дам, но коллегам это врядли поможет, потому что если у них всех плохо с памятью -- то ГЦ уже и так работает. А раз он ничего не читстит -- у них вероятно течет память. Надо брать профайлер (например йоркит) и смотреть на кучу.
http://download.oracle.com/javase/6/docs/api/java/lang/System.html#gc()
Анонимус 19.01.2011 21:46 # −2
объект уничтожат только если кончица память ( по крайней мере сановские гц так работают)
очень может быть что объект не уничтожат никогда
bugmenot 19.01.2011 21:51 # 0
Анонимус 19.01.2011 21:56 # +1
во-первых есть разные гц с разными стратегиями, некоторые из них дрочать по чуть-чуть, другие -- ставят раком приложение раз в N часов на 10 секунд. Страдают от этого разве что игры, ну так не пишите на джаве игры) энтерпрайз не страдает, сайнс приложения тоже не страдают.
во вторых на современных железках эти менопаузы вообще не видны.
ну и наконец, раз уж мы играем в софистов, припомню слова миркософт про дотнет: "приложения на .NET работают быстрее нативных приложений потому что JITятся под конкретный процессор". Со времен хотспота в жабе некоторые кусочки тоже джитяцца)
bugmenot 19.01.2011 22:23 # 0
> играем в софистов
Вы описали принцип работы, я сделал вывод. Что же вам не нравится? Или не стоило воспринимать так буквально?
Анонимус 19.01.2011 22:24 # −1
я и сказал что это немного преувеличино
bugmenot 19.01.2011 22:28 # 0
ээ? хотите конфетку?
в любом случае - субоптимально
Анонимус 19.01.2011 22:34 # 0
мир вообще говно
x86 -- не самый оптимальный процессор например.
винда -- далеко не лучшая ось.
bugmenot 19.01.2011 23:02 # −2
Анонимус 19.01.2011 23:04 # −2
bugmenot 19.01.2011 23:09 # 0
Lure Of Chaos 20.01.2011 16:48 # +3
bugmenot 20.01.2011 19:25 # −1
Lure Of Chaos 20.01.2011 19:29 # 0
Анонимус 19.01.2011 21:43 # −1
мне кажется Вам стоит почитать про GC.
delete не возможен впринципе в языках с автоматическим управлением памятью. Что будет с указателем, если объект удалили? аксесс виолейшен?))
unset в пыхе не удаляет объект из кучи, он обнуляет переменную.
Не стоит говорить вещи, не разобравшись. Звучит глупо. Все равно что сказать "меня бесит что в сях до сих пор нет рефлексии"
Dummy00001 19.01.2011 23:38 # +1
как следует из пыховой документации, это было передрано с перла. насколько много они передрали, я к сожалению не знаю.
в перле, если ты делаешь переменной undef (аналог пыхого unset) и на переменную нет ссылок, то память даже до GC не доходит и моментально удаляется (валится в фрии пул). выход из контекста из-за производительности этого в общем случае не делает - там всех деталей я не знаю. а т.к. undef я сам не раз использовал (например перегонка тон данных из базы в базу) то знаю что помогает реально.
жаба в таких ситуациях сначала отжирает у системы всю память которую ей разрешили отожрать, а потом уже начинает ресайклить.
у меня один перловый сетевой сервак работает уже 53 дня - а расход памяти все еще 7МБ. сколько транзакций обработал, счет уже потерян давно. ну прям магия. (преднамерено там undefы нигде не развешивал: там просто почти все локальные переменные.)
Анонимус 19.01.2011 23:59 # +2
причем тут delete-то?
в случае delete $boo указывало бы в кусок памяти, где уже ничего нет, и был бы эксепшен.
теперь по второй части:
Жаба (сановская) отжирает сразу же столько, сколько указано в -Xms (кажется так называется парметр) и растет до -Xmx. Дальше вылетает срабатывает GC. Хотя он может и раньше сработать (и его даже можно явно вызвать через Runtime, если знаете что лучше почистится сейчас).
Что бы добится на жабе таких же эффектов, как на перловом серваке -- надо задать максимальный размер хипа (7 метров в жабе не получится конечно, но например 50 -- можно).
Резюмирую:
1) Ни Perl ни PHP ни Java не дают ЯВНО удалить объект из памяти, если на него все еще есть ссылки. delete нету ни в одном из этих языков.
2) Java запускает GC не постоянно, а когда у нее кончается память потому, что это -- тяжелая операция, зачем делать ее "просто так"?
3) В жабе можно явно вызвать GC через Runtime.
4) Реализация delete (явного удаления объекта из памяти внезависимости от ссылок) физически невозможна в языках с автоматическим управлением памятью. Если ОЧЕНЬ хочется -- есть WeakReference. Это прокси класс. GC заколлектит лежащий в нем объект, а WeakReference превратится в null.
Lure Of Chaos 20.01.2011 15:56 # 0
только один момент - слабых ссылок в пхп нет
lispython 19.01.2011 20:27 # −2
Анонимус 19.01.2011 22:18 # +2
такое ощущение, что его писали или в 97м году под java 1.1 или человек два дня как перелез на жабу с пхп.
во-первых что случилось с итерациями?
во-вторых зачем =null?
в-третьих зачем new Long, когда есть автобоксинг?
в четвертых что за пхпобразный кверибилдер?
короче не джава-стайл совершенно